循环访问SQL Server表,运行该行的存储过程,并将结果放入表

时间:2015-10-30 10:59:43

标签: sql-server tsql stored-procedures sql-server-2008-r2

我有一个SQL Server存储过程,可以在几天内获得员工的时钟。该过程使用卡代码值来获取有关员工的信息。

我想要做的是从一个表中选择所有CardCodes,然后遍历运行存储过程的每个记录,然后创建一个包含每个记录结果的表。所以到最后会有一个表,每个员工的工作时间。

查询获取CardCodes的列表:

SELECT     
    CardCode
FROM
    CHINA_VISION_PubCards

生成这样的列表。

007b7aaf
00cf77b6
00cf9200
00cf9f40
007B6FFB
00d398dd
00cf4673

等等。

我可以像这样在SQL Server中运行存储的进程。

EXEC [dbo].[getPast5DaysWorkedHours] @CardCode = N'007da097'

007da097是员工的卡代码。

这会产生如下结果:

Employee Name | CardCode  |  Clock No  | Date   |  Seconds |  Time  
     Name       007da097      005718    2015.10.16  28761   07:59:21
     Name       007da097      005718    2015.10.21  28991   08:03:11
     Name       007da097      005718    2015.10.23  29768   08:16:08
     Name       007da097      005718    2015.10.28  29441   08:10:41

重申我要做的事情:我想遍历卡片代码列表,并为每个卡片代码运行带有cardCode值的存储过程。然后将每个过程调用的结果放入一个表中。

2 个答案:

答案 0 :(得分:1)

SQL has while loop While Loop T-SQL You can do somthing like this. (Untested) IF OBJECT_ID('TempDB..#TEMP') IS NOT NULL DROP TABLE #TEMP SELECT distinct CardCode INTO #TEMP FROM CHINA_VISION_PubCards WHILE ( (select count(*) FROM #TEMP) > 0 ) BEGIN DECLARE @CardCode varchar(50) SELECT TOP 1 @CardCode=CardCode FROM #TEMP INSERT INTO TableTarget EXEC [dbo].[getPast5DaysWorkedHours] @CardCode DELETE FROM #TEMP WHERE CardCode = @CardCode END

答案 1 :(得分:1)

您可以使用WHILE循环遍历每个条目,而无需使用游标或重复SELECT和DELETE:

DECLARE @store table (id bigint identity(1,1), CardCode (your cardcode column type here))

insert into @store (CardCode)
SELECT DISTINCT     
    CardCode
FROM
    CHINA_VISION_PubCards

declare @idx bigint = 1
declare @max bigint = (select MAX(id) from @store)

WHILE @idx<=@max
BEGIN
EXEC [dbo].[getPast5DaysWorkedHours] @CardCode = (select top 1 CardCode from @store where id = @idx)

set @idx = @idx+1

END

但评论是正确的 - 如果你可以使用表值参数来传递一组值,那就更好了。