1

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

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

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

我已经试过了

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

但它返回一个错误。

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

我该怎么做?提前致谢。

4

2 回答 2

4

这里假装没有SQL注入的问题*,你可以通过在周围加引号来快速修复你的代码Book。的值@ InsertValues应该是

'Book', 100

而不是简单地

Book, 100

您需要在每个字符串值周围添加引号;否则,字符串将被解释为无效的名称。

编辑:(作为对评论的回应)如果所有列都是varchar类型,您可以在整个字符串周围加上引号,并将所有逗号替换为 quote-comma-quote 模式,如下所示:

values('''+REPLACE(@InsertValues,',',''',''')+''')'


*你不应该把这样的代码投入生产,因为它可以被操纵来相当严重地损害你的系统。这是问题的一个很好的说明(链接)。

于 2012-10-18T09:47:00.070 回答
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 注入攻击。但是,它会做你需要的。

动态 SQL 的祸与福

于 2012-10-18T09:46:14.007 回答