2012-10-02 48 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。