当我在兼容级别为130的SQL Server 2016数据库上运行此T-SQL时,出现错误:
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
的使用:
第15级状态1行5的消息102
'@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
这样的 magical 函数,它要求第一个参数是字符串文字(不允许使用表达式)但是sp_addextendedproperty
的文档中没有提到对@value
参数的任何限制:
[ @value= ] { 'value'}
是与属性关联的值。值为
sql_variant
,默认值为NULL。值的大小不能超过7,500字节。
答案 0 :(得分:2)
将值传递给存储过程时,只能传递值,并且存储过程不允许对表达式求值。
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,也不是某种特殊情况。您面临的问题适用于任何类型的存储过程调用和使用。
因此,在集合(或说选择)中,可以使用表达式,但不能用于将值传递给存储过程。