Почему я не могу использовать встроенное выражение в sp_addextendedproperty, но я могу использовать переменную? - PullRequest
0 голосов
/ 01 февраля 2019

Когда я запускаю этот T-SQL в базе данных SQL Server 2016 с уровнем совместимости 130, я получаю сообщение об ошибке:

DECLARE @myVariable int = 4;

EXEC sys.sp_addextendedproperty
    @name = N'MyExtendedProperty',
    @value = FORMAT( @myVariable, 'd', 'en-US' ), 
    @level0type = N'SCHEMA', @level0name=N'dbo',
    @level1type = N'TABLE' , @level1name=N'MyTable';

Ниже приведено сообщение об ошибке, и SSMS выделяет использование @myVariable ввызов функции FORMAT:

Сообщение 102, Уровень 15, Состояние 1, Строка 5
Неверный синтаксис рядом с '@ myVariable'

Но если я используюпромежуточная переменная, в которой SQL выполняется успешно:

DECLARE @myVariable int = 4;

DECLARE @myVariableText nvarchar(10) = FORMAT( @myVariable, 'd', 'en-US' )

EXEC sys.sp_addextendedproperty
    @name = N'MyExtendedProperty',
    @value = @myVariableText, 
    @level0type = N'SCHEMA', @level0name=N'dbo',
    @level1type = N'TABLE' , @level1name=N'MyTable';

Мне было интересно, является ли FORMAT или sp_addextendedproperty магической функцией, подобной RAISERROR, которая требует, чтобы первый аргумент былстроковый литерал (выражения не допускаются), но в документации для sp_addextendedproperty не упоминаются какие-либо ограничения параметра @value:

https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-addextendedproperty-transact-sql?view=sql-server-2017

[ @value= ] { 'value'}

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

1 Ответ

0 голосов
/ 01 февраля 2019

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

exec myProc 2    is ok

exec myProc @SomeIntValue    is ok

Но,

exec myProc 2 + 2   is NOT ok.

Такв то время как простой набор, такой как

DECLARE @i as int

Set @i = (2 + 2)

exec myProc @i

Вышеприведенное нормально, поскольку вы можете ТОЛЬКО передать «значение» хранимой процедуре.Вы не можете передать выражение.По сути, для параметров, передаваемых хранимой процедуре, нет службы оценки или выражения.

Таким образом, эта проблема НЕ ограничивается использованием sys.sp_addextendedproperty, а также не является ОСОБЫМ случаем некоторого вида.Проблема, с которой вы сталкиваетесь, касается любого вызова и использования хранимой процедуры.

Таким образом, в наборе или, скажем, select можно использовать выражения, но не для передачи значений хранимой процедуре.

...