1

我试图了解单引号在 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

4 回答 4

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
于 2013-08-27T14:35:19.187 回答
2

Try this:

DECLARE @query VARCHAR(MAX) 

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

PRINT @query 

The problem isn't the quotes, but the data types.
NEWID isn't a string and neither is the number 28.

Good luck!

于 2013-08-27T14:31:54.967 回答
2

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

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

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

PRINT @query;

现在,您应该将其NVARCHAR(MAX)用作参数,因为最终您应该使用sp_executesql而不是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 注入更安全,它让你不再试图找出和处理将单引号嵌入字符串的麻烦......

于 2013-08-27T14:40:23.017 回答
2

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

insert into fileLog
(
  id,
  rollNo
)
values
(
  NEWID(),
  28
)
于 2013-08-27T14:43:50.473 回答