[英]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.