2013-08-27 5 views
1

Я пытаюсь понять, как одинарные кавычки работают в SQL. Все, что я хочу достичь, этоСтрока вставки с кавычками в SQL

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

Здесь ID это поле UniqueIdentifier и rollNo является внутр.

Так что я этот пример код теста:

set @query = ' 

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

print @query 

Я пытался несколько сочетания одинарных кавычек слева и справа, но ничего не работает. Я был бы очень признателен, если бы кто-то мог это решить. Но, в частности, я хотел знать, сколько одиночных кавычек требуется с обеих сторон строки, чтобы получить что-то вроде «SQL».

Благодаря

+1

Вам нужно всего лишь 2 '«'S внутри строки для указания' '» характер. Вы можете, например, упростить ''' '' + ','' to ''' ',''. – Dukeling

+1

Если вы не полностью понимаете риски внедрения SQL, тогда STOP RIGHT THERE. – podiluska

ответ

2

(я буду считать, что вам нужен динамический 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 инъекций и позволяет прекратить попытки выяснить и иметь дело с хлопоты вложения одинарных кавычек в строку ...

+0

Благодарим вас за то, что вы пытаетесь объяснить это. Самый высокий ответ. –

2

Попробуйте это:

DECLARE @query VARCHAR(MAX) 

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

PRINT @query 

Проблема не цитаты, но типы данных.
NEWID не является нитью и не является номером 28.

Удачи!

+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 
+0

Спасибо, что преподаете эту технику. Я использую динамический SQL, поскольку основная вставка более сложна, так как я вставляю pdf-файл, используя openrowset, а также несколько других столбцов. –

2

Если вам не требуется динамический SQL для какой-то причине, вы можете, вероятно, просто сделать это:

insert into fileLog 
(
    id, 
    rollNo 
) 
values 
(
    NEWID(), 
    28 
) 
Смежные вопросы