【问题标题】:What is a clean way of passing a list of ints between stored procedures?在存储过程之间传递整数列表的干净方法是什么?
【发布时间】:2017-07-16 21:19:07
【问题描述】:

我有一个存储过程,它会生成一个填充有 INT 的临时表。我还有另一个存储过程,我想获取一个 INT 列表来对它们执行处理。

据我所知,没有一种干净的方法可以在存储过程之间传递值列表,因此我将临时表中的 INT 转换为 VARCHAR,其中包含 CSV 格式的 INT。然后,我的另一个存储过程接收包含 CSV 值的 VARCHAR 并将它们解析回表格格式以开始处理。

我担心的是我的 CSV 方法使用了 .Split 方法,我不能在我的部署环境中使用它,而且似乎也是一种传递值的资源繁重的方式。

我的第一个存储过程中的表到 CSV 转换如下所示:

DECLARE @tmpCSV VARCHAR(250)
set @tmpCSV = '';
SELECT @tmpCSV = @tmpCSV + CAST(i.HistoryID AS VARCHAR) + ', ' FROM @tmpIntTbl i

我在其他存储过程中的 CSV 到表转换如下所示:

INSERT INTO @TempTable
    SELECT CAST(items AS INT)
    FROM dbo.Split(@PassedInInts, ',')

第二个 SPROC 定义:

CREATE PROCEDURE [dbo].[SecondSPROC]
    (
        @TheIDS THENEWTYPE READONLY
    )

我想知道是否有更简洁的方法在存储过程之间传递 INT 列表?

提前致谢!

【问题讨论】:

    标签: sql-server database tsql csv stored-procedures


    【解决方案1】:

    您是否为此目的调查过table-valued parameters?我相信它们可以从 SQL Server 2008 中获得。

    我想您可以将INT 值列表创建为@TABLE 变量,然后您可以毫无问题地将其传递给第二个SP。

    如果您需要对这些值执行任何 DML 语句,例如 INSERTUPDATEDELETE,您可以将它们放入第二个 SP 内的新表变量中以实现这些目的。

    这样做可以节省您对正在使用的 dbo.Split() 函数的使用,并且无需创建实际的临时表并在之后执行结果清理。

    一个简单的例子可能如下所示:

    CREATE TYPE TVPType AS TABLE (Col1 INT, Col2 INT, Col3 INT);
    
    CREATE PROCEDURE dbo.TVPTest @TABLE TVPType READONLY
    AS
    BEGIN
        SELECT TOP 1 *
        FROM @TABLE
        ;
    END
    ;
    
    DECLARE @TABLE AS TVPType;
    
    INSERT INTO @TABLE VALUES (1,2,3);
    INSERT INTO @TABLE VALUES (4,5,6);
    INSERT INTO @TABLE VALUES (7,8,9);
    
    EXEC dbo.TVPTest @TABLE;
    

    返回:

    Col1  Col2  Col3
    1     2     3
    

    【讨论】:

    • 感谢您的回答 3BK。我曾尝试使用表值参数,但是当我尝试将表传递到我的其他存储过程时,我收到一条错误消息“必须声明标量变量”。我想这可以通过 GO 语句解决,但是 SQL 对我来说非常陌生,当我将 GO 放在我的 DECLARE 下时,它似乎会在我的其他变量下抛出错误。除此之外,第二个存储过程的创建是在不同的文件中完成的,因此它找不到我创建的 TYPE。不幸的是,我也不能只移动要在第一个 SPROC 中创建的存储过程。
    • 嘿,马克。您能否将您的 SP 定义添加到您的问题中,以便我可以看到问题出在哪里?如果您使用的是正确版本的 SQL Server 并根据需要声明类型,则您不应该收到该错误。您可以提供的任何额外信息都可以让我对您的需求做出更准确的回答。谢谢。
    • 这是一个冗长的 SPROC,所以我试图避免在问题中发布它。它的要点是我在我的存储过程之前创建类型,然后按照我的其他问题建议 (stackoverflow.com/questions/42408027/…) 放置一个 GO,这很好,因为在我尝试通过之前,其他非类型变量上没有标量变量问题TYPE 变量到另一个函数中,它表示标量错误。我已经在问题中定义了第二个函数。
    • 只添加 SP 最上部分的屏幕截图怎么样?我们不需要全部内容,但仅查看您尝试运行的查询的屏幕截图可能会为您提供有关您为什么会收到此错误的线索。像这样给你调试好难啊……
    • AFAIK,表值参数自 2008 版起可用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    相关资源
    最近更新 更多