2014-01-03 3 views
0

У меня есть список значений, которые, т.е.ForEach Loop в SQL Server

in ('1xxx','12xx','21xx','98xx','00xx') 

я хочу использовать для сценария вставки. Как написать цикл for в SQL Server, используя каждое значение в цикле? Я думаю, что-то вроде.

For value in ('1xxx','12xx','21xx','98xx','00xx') 
    select value 
endloop; 

Im пытается просто это

INSERT INTO [dbo].[TimeCard] 
    VALUES 
      ('test'+Right(NewId(),12),'6121126800','5102289289',CONVERT(DATE,'01-01-2013'),CONVERT(DATE,'01-01-2013'),20,CURRENT_TIMESTAMP,NULL) 
    GO 

    INSERT INTO [dbo].[TimeCard] 
    VALUES 
      ('test'+Right(NewId(),12),'6121126800','5102289289',CONVERT(DATE,'01-08-2013'),CONVERT(DATE,'01-08-2013'),20,CURRENT_TIMESTAMP,NULL) 
    GO 


    INSERT INTO [dbo].[TimeCard] 
    VALUES 
      ('test'+Right(NewId(),12),'6121126800','5102289289',CONVERT(DATE,'01-15-2013'),CONVERT(DATE,'01-15-2013'),20,CURRENT_TIMESTAMP,NULL) 
    GO 
.... 

я должен вставить эти записи для нескольких сценариев тестирования.

+0

1. создать временную таблицу. 2. Заполните его предметами. 3. Создайте курсор в таблице. 4. итерации с помощью курсора. – MarcinJuraszek

+1

SQL Server не имеет 'FOR EACH', он имеет' DO WHILE': [Clicky] (http://technet.microsoft.com/en-us/library/ms178642.aspx). Но, вероятно, есть лучшие способы обрабатывать это, чем цикл или курсоры. – Andrew

+4

Откуда этот список? Лучше всего начинать «думать в наборах», а не итерации. Если ваш список пришел из запроса, вы можете легко вставить результат в другую таблицу. – n8wrl

ответ

1

Вам не нужны дорогие циклы, курсоры или функции для создания набора из этих значений, которые вы передали вручную.

DECLARE @start DATE = '20130101', @now DATETIME2(7) = CURRENT_TIMESTAMP; 

;WITH months AS 
(
    -- we need 12 months 
    SELECT TOP (12) m = number FROM master.dbo.spt_values 
    WHERE type = 'P' ORDER BY number 
), 
-- we need a week in each month, starting at the 1st 
weeks AS (SELECT w FROM (VALUES(0),(1),(2),(3)) AS w(w)), 
dates AS 
(
    -- this produces a date for the first 4 weeks of each 
    -- month from the start date 
    SELECT d = DATEADD(WEEK,w.w,DATEADD(MONTH,m.m,@start)) 
    FROM months AS m CROSS JOIN weeks AS w 
), 
vals AS 
(
    -- and here are the values you were given 
    SELECT v FROM (VALUES('1xxx'),('12xx'),('21xx'),('98xx'),('00xx')) AS v(v) 
) 
-- INSERT dbo.TimeCard(column list here please) 
SELECT 
    'Test' + RIGHT(NEWID(),12), 
    '6121126800', 
    vals.v, 
    dates.d, 
    dates.d, 
    20, 
    @now, 
    NULL 
FROM dates CROSS JOIN vals 
ORDER BY vals.v,dates.d; 

Это должно возвращать 240 строк (12 месяцев * 4 недели * 5 значений, указанных в вашем вопросе). Когда вы управляете выводами, чтобы быть тем, что ожидаете, раскомментируйте INSERT (но, пожалуйста, привыкните размещать там список столбцов).

+0

Огромное спасибо –

+0

Что представляет собой тип Where = 'P' в строке 7? –

+1

@AntarrByrd ограничивает вывод последовательностью * уникальных * номеров, принадлежащих хранимым процедурам.Если вы не фильтруете этот путь, вы можете получить несколько значений 1, несколько значений 2 и т. Д. Сравните 'SELECT TOP (10) number FROM master.dbo.spt_values;' с 'SELECT TOP (10) number FROM master .dbo.spt_values ​​WHERE type = 'P'; ' –

-1

Я думаю, вы можете использовать курсор, но вам нужно поместить этот ('1xxx','12xx','21xx','98xx','00xx')

в чем-то вроде этого

select '1xxx','12xx','21xx','98xx','00xx' 

Более подробной информации о курсоре:

http://technet.microsoft.com/pt-br/library/ms180169.aspx

1

Если у вас есть строка с разделителями-запятыми, используйте некоторые из этих 4 функций, которые возвращают таблицу (http://blogs.msdn.com/b/amitjet/archive/2009/12/11/sql-server-comma-separated-string-to-table.aspx). Вставьте возвращаемые данные в таблицу temp с графом идентичности (1,1).

После этого цикл через таблицу с помощью курсора или с использованием ранее созданного столбца идентификации. http://technet.microsoft.com/en-us/library/ms178642.aspx