2009-08-11 35 views
1

我需要對多個數據庫進行查詢。我得到了構建每個數據庫的查詢的部分,但現在我需要將結果放在每個查詢的某些內容中,然後我可以將其返回。SQL Server:如何使用未知列的dataype /名稱創建臨時表?

@requete是查詢

ALTER PROCEDURE [dbo].[RequeteMultiBd] 
    @requete varchar(max) 
AS 
BEGIN 

    --get server + database name 
    select dbo.trim(Serveur)+'.'+ dbo.trim(db) as name, row_number() over (order by db) seq into #tmp from dbo.DataBase; 

    declare @name sysname 
    declare @sql nvarchar(max) 
    declare @seq int 
    set @seq = 0 

    --getting the next name and seq 
    select top 1 @name = name, @seq = seq 
      from #tmp where seq > @seq order by seq 

    set @sql = replace(@requete, '<bd>', @name); 
    --Trying to init the table (that part doesnt work) 
    insert into #result exec(@sql); 

    --Filling up the table 
    WHILE (1=1) 
    BEGIN 
     select top 1 @name = name, @seq = seq 
      from #tmp where seq > @seq order by seq 
     if(@@rowcount = 0) break; 

     set @sql = replace(@requete, '<bd>', @name); 
     insert into #result exec(@sql); 

    END 
    select * from #result 

END 

從這個代碼我得到這個錯誤,因爲#result不會退出。我需要用動態列名創建它,但是如何?

無效的對象名稱#result「使用SELECT .... INTO #Result FROM ...

這將創建具有正確列的表

回答

1
+0

什麼是「...」? 我tryed:從exec(@sql)選擇*到#result; 但我得到: 關鍵字'exec'附近的語法錯誤。 – 2009-08-11 15:42:25

+0

Requete看起來像動態SQL。 你可以把INTO放在exec()裏面。像這個exec('SELECT * INTO'結果FROM('+ @requete +')R – pjp 2009-08-11 15:54:44

+2

實際上,在執行後聲明的#Result對調用存儲過程是不可見的......對不起。 – pjp 2009-08-11 16:15:50

0

您可能能夠過程調用之間共享一個臨時表,我從來數據庫之間做到了,但...

看看這個:

How to Share Data Between Stored Procedures by Erland Sommarskog

+0

我不能這樣做,因爲這個過程可以被多個用戶同時調用,臨時表中的數據將是錯誤的 – 2009-08-11 15:40:46

+1

臨時表對於調用作用域是本地的,每次運行都得到它自己的表,就像每次運行得到它們自己的變量一樣。 – 2009-08-11 15:47:15

+0

如果你在過程中創建一個臨時表,然後從該過程調用的每個過程都可以在該臨時表中選擇/插入/更新/刪除,從而共享該表。 – 2009-08-11 15:48:51

0

你不需要使用動態sql來運行你的存儲過程,你可以這樣稱呼它:

EXEC @requete '<bd>', @name 

其中@requete是一個有效的名稱,例如server.owner.procedure_name

+0

我忘了翻譯一個變量(我用法語寫)@ reqete = query。我將查詢中的所有替換爲當前循環的數據庫。 – 2009-08-11 17:08:07