slo*_*ams 5 sql-server syntax functions
我的 SQL Server 书说你不能在里面运行一个函数EXEC并展示了一个例子:
DECLARE @NumberOfLetters int = 15;
EXEC(‘SELECT LEFT(Name,’ + CAST(@NumberOfLetters AS varchar)
+ ‘) AS ShortName FROM Production.Product’);
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为该CAST()函数需要EXEC在行之前完全解析,因此我们可以将代码修改为:
DECLARE @NumberOfLetters AS int = 15;
DECLARE @str AS varchar(255);
SET @str = ‘SELECT LEFT(Name,’ + CAST(@NumberOfLetters AS varchar) + ‘) AS ShortName FROM Production.Product’;
EXEC(@str);
Run Code Online (Sandbox Code Playgroud)
这次它起作用了,因为如上所述,该CAST()功能需要EXEC在行之前完全解析。
但我还有一个问题,LEFT()函数呢,为什么可以运行EXEC?
LEFT()您示例中的函数不是EXEC语句的一部分。它位于字符串内,表示要由您的EXEC语句执行的动态 SQL 的一部分。
相反,该CAST()函数用于构建该字符串。如果您使用正确的引号 -'而不是‘& ’- 那么也许您还可以看到语法突出显示的差异:
DECLARE @NumberOfLetters int = 15;
EXEC('SELECT LEFT(Name,' + CAST(@NumberOfLetters AS varchar)
+ ') AS ShortName FROM Production.Product');
Run Code Online (Sandbox Code Playgroud)
如果语法突出显示在您的显示器上正确显示,那么您应该能够看到LEFT关键字作为字符串的一部分显示为红色,而名称CAST显示为不同的颜色,这是因为它不是字符串的一部分,而是用于构造字符串的表达式的一部分。这正是问题所在:EXEC (...)不接受表达式。它只接受(单个)字符串文字或字符串变量。
因为您必须基于某些值(@NumberOfLetters在本例中为值)构建动态 SQL 脚本,所以必须使用变量。您将构建的脚本存储在其中,然后将其传递给EXEC语句以运行动态脚本。这就是修改后的代码所做的:
DECLARE @NumberOfLetters AS int = 15;
DECLARE @str AS varchar(255);
-- you build the dynamic script first and store it in a variable
SET @str = 'SELECT LEFT(Name,' + CAST(@NumberOfLetters AS varchar)
+ ') AS ShortName FROM Production.Product';
-- then you just pass the variable to EXEC to run the dynamic script
EXEC(@str);
Run Code Online (Sandbox Code Playgroud)