在SQL中使用引号构建insert语句

时间:2013-08-27 14:26:47

标签: sql sql-server

我试图了解单引号如何在SQL中工作。 我想要实现的只是

INSERT INTO LOGTABLE 
            (ID, 
             ROLLNO) 
VALUES     ('E8645F55-A18C-43EA-9D68-1F9068F8A9FB', 
            28) 

此处ID是uniqueidentifier字段,rollNo是int。

所以我有这个示例测试代码:

 set @query = '

insert into fileLog
(
    id,
    rollNo
)
values
('+
'''' + NEWID() + '''' + ',' + 28 + 
')'

print @query

我尝试了左右单引号的几种组合,但没有任何效果。如果有人能解决这个问题,我真的很感激。但特别是我想知道在字符串的两边需要多少单引号来获得类似“SQL”的内容。

由于

4 个答案:

答案 0 :(得分:3)

我的问题是:你为什么使用动态SQL?这是在某些情况下有用的技术之一,但可以轻易滥用。

至于你的问题的答案,我使用一种技术来帮助最小化SQL结构的翻转和输出:

DECLARE @query VARCHAR(MAX) 

SET @query = '

insert into fileLog
(
    id,
    rollNo
)
values
(''|NEWID|'', |INT|)'

SET @query = REPLACE(@query, '|NEWID|', NEWID())
SET @query = REPLACE(@query, '|INT|', 28)


PRINT @query

答案 1 :(得分:2)

试试这个:

DECLARE @query VARCHAR(MAX) 

SET @query = ' insert into fileLog (     id,     rollNo ) values (' + '''' + Cast(Newid() AS VARCHAR(100)) + '''' 
             + ',28)' 

PRINT @query 

问题不是引号,而是数据类型 NEWID不是字符串,也不是数字28。

祝你好运!

答案 2 :(得分:2)

(我假设您需要动态SQL,原因在于问题中不明显,因为这似乎根本不需要动态SQL。)

正如@Gidil建议的那样,这里的问题是尝试将uniqueidentifier视为字符串。在这种情况下,确实没有任何理由在外部范围内声明NEWID(),因为您可以简单地说:

SET @query = 'INSERT ... VALUES(NEWID(), 28);';

PRINT @query;

现在,you should be using NVARCHAR(MAX) as your parameter, because ultimately you should be executing this using sp_executesql, not EXEC()

如果你需要一个文字,你可以加倍引号:

DECLARE @string VARCHAR(32);
SET @string = 'foo';

SET @query = N'INSERT ... VALUES(''' + @string + ''', 28);';

但是我觉得使用CHAR(39)更具可读性:

SET @query = N'INSERT ... VALUES(' + CHAR(39) + @string + CHAR(39) + ', 28);';

更好的是不要将这些变量追加到字符串中。您应该尽可能使用正确的类型参数。

DECLARE @query NVARCHAR(MAX);
DECLARE @string VARCHAR(32), @newid UNIQUEIDENTIFIER, @id INT;
SELECT @string = 'foo', @newid = NEWID(), @id = 28;

SET @query = N'INSERT ... VALUES(@string, @newid, @id);';

EXEC sp_executesql @query,
  N'@string VARCHAR(32), @newid UNIQUEIDENTIFIER, @id INT',
  @string, @newid, @id;

它更笨重,当然,但它从SQL注入更安全,它让你停止尝试找出并处理将单引号嵌入字符串的麻烦......

答案 3 :(得分:2)

除非您出于某种原因需要动态SQL,否则您可以这样做:

insert into fileLog
(
  id,
  rollNo
)
values
(
  NEWID(),
  28
)