我有一个存储过程,该过程导致一个带有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语句,例如INSERT
,UPDATE
或DELETE
,则可以将它们扔入第二个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