2012-10-02 50 views
2

我開發了下面的代碼數量/類型的列的:獲取行的存儲過程的結果計數,無論

CREATE PROCEDURE [dbo].[Test01] 
    AS 
    BEGIN 
    SELECT * FROM TestTable 
    END 


    CREATE PROCEDURE [dbo].[Test02] 
    AS 
    BEGIN 
    DECLARE @tmp TABLE 
    (
     TestID int, 
     Test nvarchar(100), 
    ) 
    INSERT INTO @tmp 
    EXEC Test01 
    SELECT COUNT(*) FROM @tmp 
    END 

但如果我添加或TestTable刪除列,我必須修改@tmp否則其結果是:

列名或提供值的數目不匹配表定義

我該如何解決這個問題?

+2

這可以通過['OPENQUERY' /'OPENROWSET'](http://stackoverflow.com/questions/3005361/how-to-query-on-table-returned-by-stored-procedure-within-a - 程序/ 3005435#3005435),但似乎非常低效。如果你需要一個查詢來獲得某些東西,你最好寫這個特定的查詢。此外,如果您將存儲的proc重寫爲內嵌TVF,那麼您可以在其上調用COUNT(*)',這應該是效率明智的。 –

+0

對不起,我簡化了也沒有解釋問題:第一個SP執行JOIN給我一個結果,第二個SP,只有當第一個SP中的結果數等於傳遞的參數時才插入行。 無論如何非常感謝你,我用OPENROWSET解決了這個問題。 Damiano – Blackshark

回答

2

嘗試手動指定列:

SELECT a, b FROM TestTable 

INSERT INTO @tmp (a, b) 

這應該可以解決你提到的錯誤。

0

我的第一個評論是,SELECT *是皺眉,除非你真的知道你在做什麼。我強烈建議您不要在您的特定使用案例中使用它,正是因爲它可能會讓您陷入您確定的困境。

你的具體情況,對具體的SP寫的,你還沒有使用SET NOCOUNT ON,所以你可以檢索使用

SELECT @@ROWCOUNT 

但隨後由於馬丁曾評論的數量,這只是一些示例代碼,您扔在一起。否則,爲什麼甚至使用2個SP。