我正在构建一些脚本并发现一个烦恼是我无法提供表达式作为 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 的限制还是有解决方法?
是的,这是 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 标准等方面的立场变化而变得更加明显)。