Почему я не могу использовать функцию NCHAR в операторе EXEC - PullRequest
1 голос
/ 31 января 2012

Почему я не могу это сделать?

EXEC mySproc NCHAR(0xA5)

Я получаю

Неверный синтаксис рядом с '0xa5'.

пока, яможет сделать это

DECLARE @foo NCHAR
SET @foo = NCHAR(0xA5)
EXEC mySproc @foo

и даже это

SELECT NCHAR(0xA5)

Интересно, как SQL-сервер решит оценить выражения.Есть мысли?

Ответы [ 2 ]

5 голосов
/ 31 января 2012

Поскольку он нарушает синтаксис вызова хранимых процедур T-SQL , который гласит:

Execute a stored procedure or function
[ { EXEC | EXECUTE } ]
    { 
      [ @return_status = ]
      { module_name [ ;number ] | @module_name_var } 
        [ [ @parameter = ] { value 
                           | @variable [ OUTPUT ] 
                           | [ DEFAULT ] 
                           }
        ]
      [ ,...n ]
      [ WITH RECOMPILE ]
    }
[;]

, где значение

Isзначение параметра для передачи в модуль или сквозную команду.Если имена параметров не указаны, значения параметров должны предоставляться в порядке, определенном в модуле.

При выполнении сквозных команд для связанных серверов порядок значений параметров зависит от поставщика OLE DBсвязанный сервер.Большинство поставщиков OLE DB связывают значения с параметрами слева направо.

Если значение параметра является именем объекта, символьной строкой или квалифицировано именем базы данных или именем схемы, все имя должно быть заключено в одинарные кавычки.Если значение параметра является ключевым словом, ключевое слово должно быть заключено в двойные кавычки.

Если в модуле определено значение по умолчанию, пользователь может выполнить модуль без указания параметра.

Значением по умолчанию также может быть NULL.Как правило, определение модуля определяет действие, которое должно быть выполнено, если значение параметра равно NULL.

, таким образом,

, сначала вы должны выполнить все вычисления, поместитерезультаты в переменные, а затем передать переменные в вызов SP

2 голосов
/ 31 января 2012

Вы не можете передавать вызовы функций в качестве аргументов в хранимую процедуру.Сначала вы должны оценить их (как вы делали во втором примере), а затем передать их.

Вы видите, что это также не удастся:

exec myProc len('abc')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...