包大人博客

迎奥运、讲文明、树新风 -- Welcome To Beijin 2008

About the author

Boris Yang
A troupe of little vagrants of the world, leave your footprints in my words.
E-mail me Send mail

Recent comments

Author

Disclaimer

The opinions expressed herein are my own personal opinions and do not represent my employer's view in anyway.

© Copyright 2008

如何在 SQL Server 中 EXECUTE 字符串时返回值

    我们经常使用 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_executesqlOUTPUT 参数的形式返回变量值。同样在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]


希望有点点帮助……

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Categories: Sql Server
Posted by Admin on Monday, April 21, 2008 1:24 PM
Permalink | Comments (0) | Post RSSRSS comment feed

Related posts

Add comment


(Will show your Gravatar icon)  

  Country flag

[b][/b] - [i][/i] - [u][/u]- [quote][/quote]



Live preview

Wednesday, August 20, 2008 10:31 PM