我需要使用参数创建INSERT语句。假设我有两个变量名@DestinationFields
,@InsertValues
。
此处@DestinationFields
包含列名:product,price
,@InsertValues
包含这两列的值,例如:Book,100
。
现在,我如何创建一个插入命令来插入每个值需要添加引号的值。我已经尝试过了
我已经尝试过了
EXEC('INSERT into tbl_test('+@DestinationFields+')values('+@InsertValues+')')
但是它返回了一个错误。
名称"书"在这种情况下是不允许的。有效表达式是常量,常量表达式和(在某些情况下) 上下文)变量。不允许使用列名。
我该怎么办?提前谢谢。
答案 0 :(得分:4)
假设此处没有SQL注入问题 * ,您可以通过在Book
周围添加引号来快速修复代码。 @ InsertValues
的值应为
'Book', 100
而不是简单
Book, 100
您需要在每个字符串值周围添加引号;否则,字符串被解释为名称,这是无效的。
编辑:(响应评论)如果所有列都是varchar
类型,您可以在整个字符串周围加上引号,并使用引号 - 逗号替换所有逗号引用模式,像这样:
values('''+REPLACE(@InsertValues,',',''',''')+''')'
<小时/> * 您不应该将这样的代码投入生产,因为它可能被操纵以严重损害您的系统。以下是问题的一个很好的例证(link)。
答案 1 :(得分:0)
尝试:
DECLARE @DestinationFields VARCHAR(200);
SET @DestinationFields = 'Col1, Col2, Col3'
DECLARE @InsertValues VARCHAR(200);
SET @InsertValues = '1, 2, 3'
DECLARE @SQLString VARCHAR(1000);
SET @SQLString = 'INSERT INTO tbl_test (' + @DestinationFields + ') VALUES (' + @InsertValues + ')';
EXEC (@SQLString)
但是,这对SQL注入攻击非常开放。但是,它会做你需要的。