使用参数创建INSERT语句

时间:2012-10-18 09:43:28

标签: sql sql-server stored-procedures

我需要使用参数创建INSERT语句。假设我有两个变量名@DestinationFields@InsertValues

此处@DestinationFields包含列名:product,price@InsertValues包含这两列的值,例如:Book,100

现在,我如何创建一个插入命令来插入每个值需要添加引号的值。我已经尝试过了

我已经尝试过了

EXEC('INSERT into tbl_test('+@DestinationFields+')values('+@InsertValues+')')

但是它返回了一个错误。

  

名称"书"在这种情况下是不允许的。有效表达式是常量,常量表达式和(在某些情况下)   上下文)变量。不允许使用列名。

我该怎么办?提前谢谢。

2 个答案:

答案 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注入攻击非常开放。但是,它会做你需要的。

The Curse and Blessing of Dynamic SQL