【问题标题】:Why can't I use an inline expression in sp_addextendedproperty but I can use a variable?为什么我不能在 sp_addextendedproperty 中使用内联表达式,但我可以使用变量?
【发布时间】:2019-02-01 05:00:13
【问题描述】:

当我在兼容级别为 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 突出显示@myVariableFORMAT 函数调用中的使用:

消息 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';

我确实想知道FORMATsp_addextendedproperty 是不是像RAISERROR 这样的神奇 函数,它要求第一个参数是字符串文字(不允许使用表达式),但@987654329 的文档@ 没有提到对@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。 value 的大小不能超过 7,500 字节。

【问题讨论】:

  • T-SQL 是一种粗鲁的语言,它常常让人们惊讶于某些特性之间缺乏正交性(这里,表达式不能用在变量或文字可以使用的所有地方)

标签: sql-server extended-properties


【解决方案1】:

向存储过程传递值时,只能传递值,而存储过程不允许计算表达式。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 2020-10-07
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多