我需要编写一个循环,将 SQL 临时表上的数据一一传递给存储过程。使用下面的方法可以吗?会消耗大量内存吗?
DECLARE @SomeData AS TABLE(
Id INT,
Name VARCHAR(MAX),
Age INT
)
INSERT INTO @SomeData
( Id, Name, Age )
VALUES ( 1, 'AAAAA', 10 ),
( 2, 'BBBBB', 12 ),
( 3, 'CCCCC', 13 ),
( 4, 'DDDDD', 14 ),
( 5, 'EEEEE', 15 );
DECLARE @iterator INT = 0
WHILE @iterator< (SELECT COUNT(Id) FROM @SomeData)
BEGIN
SELECT *
FROM @SomeData
ORDER BY Id
OFFSET @iterator ROWS
FETCH NEXT 1 ROWS ONLY
SET @iterator +=1
/*Execute a Stored Procedure*/
END
我认为你不需要稍后再次 (SELECT COUNT(Id) FROM @SomeData) ,如果表 SomeData 是大数据,它会变慢。你可以这样尝试:
DECLARE @iterator INT = 0
declare @n int = (SELECT COUNT(Id) FROM @SomeData)
WHILE @iterator< @n
BEGIN
SELECT *
FROM @SomeData
ORDER BY Id
OFFSET @iterator ROWS
FETCH NEXT 1 ROWS ONLY
SET @iterator +=1
/*Execute a Stored Procedure*/
END
表变量只能用于少量行。 <100. So a query retrieving 1 row from a small table will have almost zero impact on any resource including memory. If using a temp table #Tbl (if bigger row count needed) rather than @Tbl, use an Identity column Primary Key and do similar to above but
CREATE TABLE #Tbl ID int IDENTITY(1,1) Primary Key, col1)
DECLARE @iterator INT = 0, @col1value varchar(10)
declare @n int = (SELECT COUNT(Id) FROM #Tbl)
WHILE @iterator< @n
BEGIN
SELECT @col1value = col1
FROM #Tbl
WHERE Id = @iterator
/*Execute a Stored Procedure*/
EXEC test @col1value
SET @iterator +=1
END