为什么不能在sp_addextendedproperty中使用内联表达式,但是可以使用变量?

时间:2019-02-01 05:00:14

标签: sql-server extended-properties

当我在兼容级别为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参数的任何限制:

  

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。值的大小不能超过7,500字节。

1 个答案:

答案 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,也不是某种特殊情况。您面临的问题适用于任何类型的存储过程调用和使用。

因此,在集合(或说选择)中,可以使用表达式,但不能用于将值传递给存储过程。