【问题标题】:Group the results in a stored procedure将结果分组到存储过程中
【发布时间】:2016-03-08 19:06:32
【问题描述】:

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

这个函数相当复杂,这里我就省略了,但基本上函数ForeignVendor接受一个I​​D并返回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>'

把它拿回来

NEMITZ TOOL CO.         000021  0
P & W CANADA HELICOPTER 000198  1
SHOP                    000011  0
ILS                     000010  0

一个报告需要知道最后一列中是否存在任何 1。我试图通过查询将结果传递给一个组,但这不起作用。

对处理此问题的最有效方法有何建议?

【问题讨论】:

    标签: sql-server tsql stored-procedures


    【解决方案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 中创建一个表并没有那么糟糕,除非你是在一个循环中进行大量迭代的。还有一个建议 - 您不需要 group by 和聚合来检查是否存在 - 请改用 exists()
    • @Ivan - 我想你误会了。如果不是,那么请告诉我如何使用存在来确定上面发布的表格中的列是否在任何行中的值为 1。请记住,1 或 0 是函数的结果。
    • @joe 现在我不明白。 exists 的唯一目的是找出是否存在满足条件的行。我不明白你在问什么。 if 存在 1 else 0。问题是什么?
    • @Ivan - 我不知道你在哪里存在 1 else 0。难怪你很困惑,这让我很困惑。我很乐意解释您不理解的任何内容。不明白的地方请完整说明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多