2011-09-07 67 views
3

表:我们如何为两个动态SQL语句使用EXEC sp_executesql?

create table TabA 
      (ID int, Name varchar(20)) 
      insert into TabA 
      select 1,'ABC' union 
      select 2,'DEF' union 
      select 3,'GHD' 

create table TabB 
      (ID int, Name varchar(20)) 
      insert into TabA 
      select 1,'XYZ' union 
      select 2,'STF' union 
      select 3,'LDZ' 

create table status 
      (Result1 int,Result2 int) 

Create table query(query1 varchar(1000),query2 varchar(1000)) 

      Insert into query(query1,query2) 
      select '''select COUNT(*) from TabA''','''select COUNT(*)from TabB''' 
      select * from query 

程序:

create Procedure [dbo].spStatus 
AS 
BEGIN 

    SET NOCOUNT ON; 


Declare @sqlString1 nvarchar(1000) 
    ,@sqlString2 nvarchar(1000) 
    ,@col_value1 varchar(256) 
    ,@col_value2 varchar(256) 

    select @sqlString1 = query1 
     , @sqlString2 =query2   

     from Query 


     EXEC sp_executesql      

     @[email protected], --sql string is your full select statement      

      @params = N'@col_Value1 varchar(256) OUTPUT',     

      @col_Value1 = @col_Value1 OUTPUT 
      print(@sqlString1) 

      -- @sqlString2, --sql string is your full select statement      

      [email protected] = N'@col_Value2 varchar(256) OUTPUT',     

      -- @col_Value2 = @col_Value2 OUTPUT 


     Insert Into dbo.Status(Result1,Result2) 
     Values(@col_Value1,@col_Value2) 



End 

它的工作原理,如果我们只用@[email protected],但我想这两个声明@[email protected],@[email protected]应该一起执行。

请帮助我们如何使用这两个语句来执行?

由于提前

回答

2

你的意思是:

SET @sqlString1 = @sqlString1 + ';' + @sqlString2; 

EXEC sp_executesql @query = @sqlString1 --... 
+0

如果'@ sqlString1 +';'你可能会遇到问题' + @ sqlString2'太长,无法完全驻留在'@ sqlString1'中。另外,如果'@ sqlString1'或'@ sqlString2'为'NULL',那么整个连接结果将是'NULL',并且不会运行sql。 –

+0

虽然的确如此,但我只是提供了基本的方法。虽然我们正在分离对方的答案,但应该将变量声明更改为“NVARCHAR(MAX)”,以避免消息214。 –

0

试试这个:

--add this 
DECLARE @SQL nvarchar(max) 
SET @SQL=ISNULL(@sqlString1,'')+';'+ISNULL(@sqlString2,'') 

--change this 
EXEC sp_executesql @[email protected] 
    ,@params = N'@col_Value1 varchar(256) OUTPUT' 
    ,@col_Value1 = @col_Value1 OUTPUT 
1

的毗连两个查询与+(@[email protected] + '; ' + @sqlString2)

在一起,然后用两个变量将两个计数值捕获到输出变量

0123中

OR

Insert into query(query1,query2) 
    EXEC sp_executesql 'SELECT (select COUNT(*) from TabA) AS query1, (select COUNT(*)from TabB) AS query2' 

...但实实在在地不需要动态SQL,在所有。