在存储过程之间传递一个int列表的干净方法是什么?

Mar*_*ark 0 t-sql database sql-server csv stored-procedures

我有一个存储过程,导致一个用INT填充的临时表.我还有另一个存储过程,我想在INT列表中进行处理.

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

我担心的是我的CSV方法使用了.Split我在部署环境中无法使用的方法,并且似乎也是传递值的资源.

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

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

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

INSERT INTO @TempTable
    SELECT CAST(items AS INT)
    FROM dbo.Split(@PassedInInts, ',')
Run Code Online (Sandbox Code Playgroud)

第二个SPROC定义:

CREATE PROCEDURE [dbo].[SecondSPROC]
    (
        @TheIDS THENEWTYPE READONLY
    )
Run Code Online (Sandbox Code Playgroud)

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

提前致谢!

3BK*_*3BK 6

您是否为此目的查看了表值参数?我相信它们可以从SQL Server 2008获得.

我想你可以创建INT一个值列表作为@TABLE变量,然后你可以将其传递给第二个SP而没有太多问题.

如果您需要执行任何DML语句一样INSERT,UPDATEDELETE在值,你可以把他们变成为上述目的而第二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;
Run Code Online (Sandbox Code Playgroud)

返回:

Col1  Col2  Col3
1     2     3
Run Code Online (Sandbox Code Playgroud)