为什么我不能在 sp_addextendedproperty 中使用内联表达式但我可以使用变量?
Why can't I use an inline expression in sp_addextendedproperty but I can use a variable?
当我 运行 这个 T-SQL 在兼容级别为 130 的 SQL Server 2016 数据库上时,我得到一个错误:
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 突出显示 FORMAT
函数调用中 @myVariable
的使用:
Msg 102, Level 15, State 1, Line 5
Incorrect syntax near '@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
参数的任何限制:
[ @value= ] { 'value'}
Is the value to be associated with the property. value is sql_variant
, with a default of NULL. The size of value cannot be more than 7,500 bytes.
向存储过程传递值时,只能传递值,而存储过程不允许对表达式求值。
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,您可以使用表达式,但不能将值传递给存储过程。
当我 运行 这个 T-SQL 在兼容级别为 130 的 SQL Server 2016 数据库上时,我得到一个错误:
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 突出显示 FORMAT
函数调用中 @myVariable
的使用:
Msg 102, Level 15, State 1, Line 5
Incorrect syntax near '@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
参数的任何限制:
[ @value= ] { 'value'}
Is the value to be associated with the property. value is
sql_variant
, with a default of NULL. The size of value cannot be more than 7,500 bytes.
向存储过程传递值时,只能传递值,而存储过程不允许对表达式求值。
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,您可以使用表达式,但不能将值传递给存储过程。