繁体   English   中英

动态SQL插入语句无法识别作为参数传递的值的问题

[英]Issue with dynamic SQL insert statement not recognizing values passed as parameter

我一直在尝试找出此动态SQL插入语句出了什么问题。 显然,当我向它传递一串要插入的值时,它引起的错误使它看起来好像正确地在解析,但是它说它与语句中指定的列数不匹配。 我已经附上了要在其中插入数据的表定义,动态语句和下面的values参数:

M2016_Field_ID列是一个标识列,不需要插入,与Enabled_ON列相同,后者具有分配当前日期的默认约束。

在此处输入图片说明

@valuesList = '(''description'', ''0,0'')'

SET @sql = N' INSERT INTO tblM2016_MetaData_Fields ' +
                   N' (Name, FieldNum) ' +
                   N' VALUES (@values);';
SET @params = N'@values nvarchar(max)';

IF @debug = 1
BEGIN
    PRINT @sql;
    PRINT @params;
    PRINT @valuesList;
END
ELSE
    EXEC sp_executesql @sql, @params, @values = @valuesList;

当我尝试执行该语句时,它将引发以下错误:

消息109,第15层,州1,第3行
INSERT语句中的列多于VALUES子句中指定的值。 VALUES子句中的值数必须与INSERT语句中指定的列数匹配。

您不能像这样参数化查询。 试试这个

SET @valuesList = '''description'', ''0,0'''

SET @sql = N' INSERT INTO tblM2016_MetaData_Fields ' +
                   N' (Name, FieldNum) ' +
                   N' VALUES ('+@valuesList+');';

我不相信您可以将值列表作为字符串传递到单个参数中,该参数可能正在运行,例如:

插入到tblM2016_MetaData_Fields(name,fieldnum)值('(``description'',``0.0'')')中,以便尝试将name设置为您将值列表设置为的字符串。 为了执行您要尝试的操作,您可能只需要将该字符串直接添加到sql语句中或创建两个参数(每个字段一个)。

幸运的是,单个参数仅表示查询中的单个值。 T-SQL没有列表的概念。

解决此问题的一种方法是将值列表填充到查询字符串中:

@valuesList = '(''description'', ''0,0'')'
SET @sql = N'
INSERT INTO tblM2016_MetaData_Fields (Name, FieldNum) 
     VALUES (@values)';

SET @sql = REPLACE(@sql, '@values', @valuesList);
IF @debug = 1
BEGIN
    PRINT @sql;
END;
ELSE
    EXEC sp_executesql @sql;

最好的方法确实是使用参数,但是您需要将参数分开。 同样,以这种方式,SQL Server将处理引号的转义,最好不要自己做,因为不可避免的是迟早会弄乱它。

结果:

SET @value1 = 'description'
SET @value2 = '0,0'

SET @sql = N' INSERT INTO tblM2016_MetaData_Fields ' +
           N' (Name, FieldNum) ' +
           N' VALUES (@NameV, @FieldNumV);';

SET @params = N'@NameV varchar(50), @FieldNumV varchar(max)';

EXEC sp_executesql @sql, @params, @NameV = @value1, @FieldNumV = @value2;

请注意,您还需要为Enabled_ON提供一个值,因为在表屏幕截图中将其定义为NOT NULL

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM