在存储过程之间传递INT列表的干净方式是什么



我有一个存储过程,该过程导致一个带有ints的临时表。我还有另一个存储过程,我想在INT列表中使用这些过程,以对其进行处理。

据我所知,没有一种干净的方法可以通过存储过程之间的值列表,因此我将临时表中的INT转换为VARCHAR,其中包含CSV格式的INT。然后,我的其他存储过程随后将包含CSV值的A 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 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

最新更新