我试图了解单引号如何在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”的内容。
由于
答案 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;
如果你需要一个文字,你可以加倍引号:
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
)