Sql server 将结果分组到存储过程中

Sql server 将结果分组到存储过程中,sql-server,tsql,stored-procedures,Sql Server,Tsql,Stored Procedures,我有一个返回表的存储过程。该表中的一列是T-SQL函数的结果。该函数根据ID返回0或1。存储过程接受XML中存储的ID 该函数非常复杂,因此我将在这里省略它,但基本上函数ForeignVendor接受一个ID并返回0或1 该函数接受一个xml参数并返回一个表。我需要这个函数。我希望能再利用它 以下是函数: ALTER PROCEDURE ForeignVendors @VendorIDs xml AS BEGIN SET NOCOUNT ON; SELECT

我有一个返回表的存储过程。该表中的一列是T-SQL函数的结果。该函数根据ID返回0或1。存储过程接受XML中存储的ID

该函数非常复杂,因此我将在这里省略它,但基本上函数ForeignVendor接受一个ID并返回0或1

该函数接受一个xml参数并返回一个表。我需要这个函数。我希望能再利用它

以下是函数:

ALTER PROCEDURE ForeignVendors
    @VendorIDs xml
AS
BEGIN
    SET NOCOUNT ON;

    SELECT 
        VEN_POName, 
        T.Item.value('@VendorID[1]', 'varchar(10)') AS "VendorID", 
        ForeignVendor(T.Item.value('@VendorID[1]', 'varchar(10)')) AS "ForeignFlag"
    FROM 
        VEN V
    JOIN 
        @VendorIDs.nodes('/Root/Vendor') AS T(Item) ON V.VEN_VendorID = T.Item.value('@VendorID[1]', 'varchar(10)')
END
我可以这样称呼它

exec [Rotair_ForeignVendors] N'<Root><Vendor VendorID="000010"/><Vendor VendorID="000011"/><Vendor VendorID="000198"/><Vendor VendorID="000021"/></Root>'
一个报表需要知道最后一列中是否存在任何1。我试图通过查询将结果传递给一个分组,但这不起作用


关于最有效的处理方法有什么建议吗?

像这样的怎么样

CREATE TABLE #results
(
    Vendor VARCHAR(1000),
    VendorID varchar(20),
    ForeignFlag BIT
);

INSERT INTO #results
EXEC [Rotair_ForeignVendors] N'<Root><Vendor VendorID="000010"/><Vendor VendorID="000011"/><Vendor VendorID="000198"/><Vendor VendorID="000021"/></Root>';

SELECT COUNT(ForeignFlag)
FROM #results
WHERE ForeignFlag = 1;

DROP TABLE #results;

工作完美。我希望不必处理创建表的开销。但我认为它是在记忆中创造出来的,可能不会那么糟糕。如果没有人提出不那么复杂的问题,我会把你的问题作为答案。在tempdb中创建一个表并没有那么糟糕,除非你是在一个有大量迭代的周期内完成的。还有一个建议-你不需要通过分组和聚合来检查是否存在某些东西-而是使用“存在”。@Ivan-我想你误解了。如果没有,请告诉我如何使用exists来确定上面发布的表中的列在任何行中的值是否为1。请记住,1或0是函数的结果。@joe现在我不明白了。exists的唯一目的是找出是否有任何行满足条件。我不明白你在问什么。如果存在,则为1,否则为0。问题是什么?@Ivan-我不知道你从哪里得到了1或0。难怪你感到困惑,这让我困惑。我很乐意解释你不明白的事情。请详细说明您不理解的内容。
CREATE TABLE #results
(
    Vendor VARCHAR(1000),
    VendorID varchar(20),
    ForeignFlag BIT
);

INSERT INTO #results
EXEC [Rotair_ForeignVendors] N'<Root><Vendor VendorID="000010"/><Vendor VendorID="000011"/><Vendor VendorID="000198"/><Vendor VendorID="000021"/></Root>';

SELECT COUNT(ForeignFlag)
FROM #results
WHERE ForeignFlag = 1;

DROP TABLE #results;