如何使用表达式作为 EXEC 的参数?

Dan*_*rts 3 sql-server t-sql

我正在构建一些脚本并发现一个烦恼是我无法提供表达式作为 EXEC 的参数。

这是我遇到的一个例子。我想使用包含数据库名称的一致格式设置各种项目。传递参数时我不能简单地连接字符串

EXEC msdb.dbo.sp_help_schedule
    @schedule_name = 'FullBackup_'+@DatabaseName,
    ...
Run Code Online (Sandbox Code Playgroud)

相反,我必须为最终字符串声明一个变量并传递它......

DECLARE @ScheduleName varchar(100)
SET @ScheduleName = 'FullBackup_'+@DatabaseName
EXEC msdb.dbo.sp_help_schedule
    @schedule_name = @ScheduleName,
    ...
Run Code Online (Sandbox Code Playgroud)

我在必要时动态建立了一个命令字符串,这可以实现这一点,但不想每次都这样做。这是 t-sql 的限制还是有解决方法?

Aar*_*and 6

是的,这是 T-SQL 中的一个限制。在某些情况下,您无法动态构建字符串,而必须事先这样做。

例如:

RAISERROR('String' + @variable,1,0);
EXEC dbo.procedure @param = 'String' + @variable;
Run Code Online (Sandbox Code Playgroud)

还有其他情况下它是有效的,但通常只是为了赋值,而不是为了传递或对结果做任何有建设性的事情,例如

DECLARE @var VARCHAR(32) = 'String' + @variable;
Run Code Online (Sandbox Code Playgroud)

T-SQL 只是一种古怪的语言,具有许多解析特性和奇怪的规则。我认为这只是一种长期发展的语言的性质,不同的人在不同的时间负责实现(通过他们在遵守 ANSI 标准等方面的立场变化而变得更加明显)。

  • 虽然在第一种情况下你可以做`RAISERROR('String %s',1,0,@variable);` (3认同)