(я буду считать, что вам нужен динамический SQL по причинам, не очевидно, в этом вопросе, так как это вообще не требует динамического SQL.)
Как предложил @Gidil, проблема здесь заключается в том, чтобы рассматривать уникальный идентификатор как строку. В этом случае, действительно нет никаких оснований объявлять 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 инъекций и позволяет прекратить попытки выяснить и иметь дело с хлопоты вложения одинарных кавычек в строку ...
Вам нужно всего лишь 2 '«'S внутри строки для указания' '» характер. Вы можете, например, упростить ''' '' + ','' to ''' ',''. – Dukeling
Если вы не полностью понимаете риски внедрения SQL, тогда STOP RIGHT THERE. – podiluska