2015-10-30 2 views
0

У меня есть хранимая процедура SQL Server для получения часов часов с часами в течение нескольких дней. Процедура использует значение кода карты для получения информации о сотруднике.Цитирование через таблицу 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 значение. А затем поместите результаты каждого вызова процедуры в одну таблицу.

+4

Лучше смените хранимую процедуру, чтобы ожидать @CardCode как TVP ([параметр оценки таблицы] (https://msdn.microsoft.com/en-us/library/bb510489.aspx)) и разрешить множественный ввод. Использование цикла для него очень неэффективно – lad2025

+0

Как это делается? – Oisian

+0

См. Демонстрационную версию в ссылке. Очень просто создать тип, изменить процедуру, чтобы разрешить TVP, немного изменить логику, заполнить аргумент и вызвать sp :) – lad2025

ответ

1

SQL имеет время цикла

While Loop T-SQL

Вы можете сделать Somthing как это. (Непроверенный)

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

Вы можете использовать WHILE цикл, чтобы пройти через каждую запись, без использования курсора или неоднократные ВЫБРАТЬ и удаления:

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<[email protected] 
BEGIN 
EXEC [dbo].[getPast5DaysWorkedHours] @CardCode = (select top 1 CardCode from @store where id = @idx) 

set @idx = @idx+1 

END 

Комментарии правы, хотя - это намного лучше если вы можете использовать параметр table-value, чтобы пройти через набор значений.