我们经常使用 EXECTUE关键字来执行SQL字符串:
[code:tsql]
DECLARE @IntVariable INT
DECLARE @SQLString NVARCHAR(500)
-- Build and execute a string with one parameter value.
SET @IntVariable = 35
SET @SQLString = N'SELECT * FROM pubs.dbo.employee WHERE job_lvl = ' +
CAST(@IntVariable AS NVARCHAR(10))
EXEC(@SQLString)
[/code]
但又没有考虑过让EXECUTE在执行字符串时能够返回值呢?比如:
[code:tsql]
EXECUTE('declare @a as numeric(6) select top 1 @a= bp_id from bug_posts where bp_bug=4648 print @a')
Print @a
[/code]
能不能在EXECUTE之后使用变量@a的值呢?答案是肯定的:不行。我们在上篇关于SQL Server 中 sp_executesql 与 EXECUTE 的差异的文章中提到,sql server会将EXECUTE后的字符串看成自包含批处理,对它生成单独的执行计划,所以字符串中用到的变量与外部语句是在不同的域中的,不能互访变量。
那么有没有其它方法在EXECUTE关键字执行字符串之后获取变量值呢?答案也是肯定的:不行。但我们可以通过系统存储过程 sp_executesql 以 OUTPUT 参数的形式返回变量值。同样在SQL Server 中 sp_executesql 与 EXECUTE 的差异的文章中我们也了解到在执行SQL字符串的同时sp_executesql可定义参数。
使用 OUTPUT 参数:
[code:tsql]
DECLARE @SQLString nvarchar(500);
DECLARE @a
int;
SET @SQLString = N'
SELECT @OutVariable = bp_id
from bug_posts
where bp_bug=4648 ';
EXECUTE sp_executesql @SQLString,
N'@OutVariable int OUTPUT', @OutVariable=@a
OUTPUT;
PRINT @a
[/code]
在看一个多参数的例子:
[code:tsql]
USE AdventureWorks;
GO
DECLARE @SQLString nvarchar(500);
DECLARE @ParmDefinition nvarchar(500);
DECLARE @SalesOrderNumber nvarchar(25);
DECLARE @IntVariable
int;
SET @SQLString = N'SELECT @SalesOrderOUT = MAX(SalesOrderNumber)
FROM Sales.SalesOrderHeader
WHERE CustomerID = @CustomerID';
SET @ParmDefinition = N'@CustomerID int,
@SalesOrderOUT nvarchar(25) OUTPUT';
SET @IntVariable = 22276;
EXECUTE sp_executesql
@SQLString,
@ParmDefinition,
@CustomerID = @IntVariable,
@SalesOrderOUT = @SalesOrderNumber OUTPUT;
-- This SELECT statement returns the value of the OUTPUT parameter.
SELECT @SalesOrderNumber;
-- This SELECT statement uses the value of the OUTPUT parameter in
-- the WHERE clause.
SELECT OrderDate, TotalDue
FROM Sales.SalesOrderHeader
WHERE SalesOrderNumber = @SalesOrderNumber;
[/code]
希望有点点帮助……