2011-09-07 68 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,在所有。