T-SQL: синтаксис кавычек при построении строки SQL

Я создаю строку SQL, в основном предложение WHERE, на лету на основе переданных параметров и выполнения построенной строки. В итоге получается: EXEC (@strSELECT + @strFROM + @strWHERE + @strORDERBY).

Мой @strSELECT выглядит так: SET @strSELECT = 'SELECT DISTINCT FieldA, FIELDB, FIELDC'

Все это работает до сих пор, но теперь я добавил поле вложенной функции в конец @strSELECT, так что весь @strSELECT теперь выглядит так: SET @strSELECT = 'SELECT DISTINCT FieldA, FIELDB, FIELDC, UPPER(REPLACE(CONVERT(VARCHAR, CAST(MyStringDateField AS DATETIME),6),' ','-')) AS FormattedDate'

Я знаю, что новое поле вложенной функции работает, потому что я тестировал его без конкантенации, и я также знаю, что проблема связана с одинарными кавычками [' ','-'] внутри функции. Может ли кто-нибудь помочь мне с правильным синтаксисом кавычек при построении строки запроса? Спасибо.


person Kevin    schedule 02.03.2011    source источник


Ответы (3)


Вам нужно будет сделать так, чтобы ваша вложенная функция выглядела так:

ПРОПИСН(ЗАМЕНИТЬ(ПРЕОБРАЗОВАТЬ(varchar, CAST(MyStringDateField AS datetime),6),'' '',''-''))

person ajdams    schedule 02.03.2011

Удвойте кавычки внутри строки. Это работает для меня и возвращает "02-MAR-11":

DECLARE @strSELECT nvarchar(200)
SET @strSELECT = 'SELECT UPPER(REPLACE(CONVERT(VARCHAR, CAST(GETDATE() AS DATETIME),6),'' '',''-'')) AS FormattedDate'
EXECUTE sp_executesql @strSELECT
person Andrew Charlton    schedule 02.03.2011

Чтобы вставить одинарную кавычку в строку T-SQL, вы добавляете еще одну одинарную кавычку. Таким образом, ваше выражение @strSelect становится

SET @strSELECT = 'SELECT DISTINCT FieldA, FIELDB, FIELDC, UPPER(REPLACE(CONVERT(VARCHAR, CAST(MyStringDateField AS DATETIME),6),'' '',''-'')) AS FormattedDate'

Однако это не означает, что это правильный способ сделать это. Вы должны стараться использовать параметризованные запросы везде, где это возможно, чтобы избежать атак SQL-инъекций.

person Panagiotis Kanavos    schedule 02.03.2011