Pavan Mand Ответов: 3

Выполните инструкцию SQL N-й раз


Можно ли в SQL server запускать SQL-операторы N-й раз? Я хочу запустить заявление belwo 50 раз..

insert into [IMSIdentity] 

select *
from [IMSIdentity] 


Что я уже пробовал:

Я попытался перекрестно применить заявление без удачи

3 Ответов

Рейтинг:
5

CHill60

Если это для тестовых данных ТОЛЬКО вы можете использовать функцию SQL GO оператор, который позволяет запускать пакет несколько раз. Вы просто заключаете свою партию между GO заявления.

Пример:

CREATE TABLE #Example (id int identity(1,1), dat nvarchar(20))
GO  -- This one is important otherwise it tries to create the table again
insert into #Example (dat) VALUES ('A'), ('B'),('C'), ('D'),('E')
GO 10
SELECT * FROM #example
Это даст мне 50 строк в таблице. Если вы посмотрите на выходные сообщения Вы можете увидеть что происходит
Beginning execution loop

(5 row(s) affected)

(5 row(s) affected)

(5 row(s) affected)

(5 row(s) affected)

(5 row(s) affected)

(5 row(s) affected)

(5 row(s) affected)

(5 row(s) affected)

(5 row(s) affected)

(5 row(s) affected)
Batch execution completed 10 times.

(50 row(s) affected)
В качестве альтернативы, используя SELECT точно так же вы должны попробовать
INSERT INTO #Example SELECT TOP 1 dat FROM #Example
GO 49
Я не могу вспомнить, где я впервые увидел это, но вот ссылка на MSSQLTips.com статья о том же самом Выполнение пакета TSQL несколько раз с помощью GO[^]

Я не могу достаточно сильно подчеркнуть, что эта техника никогда не должна найти свой путь в производственный код - она просто не будет работать.
GO-это не инструкция Transact-SQL; это команда, распознаваемая утилитами sqlcmd и osql, а также редактором кода SQL Server Management Studio.


Maciej Los

5ed!

Jörgen Andersson

Круто

Рейтинг:
17

Maciej Los

Вы можете использовать Указатель[^] или КТОС[^].

ExXample - использование CTE:

DECLARE @tmp TABLE(MyId int)
DECLARE @maxId int = 50

;WITH CTE AS
(
    --initial value
    SELECT 1 AS MyId
    --recursive part
    UNION ALL
    SELECT MyId +1
    FROM CTE
    WHERE MyId<@maxId
)
INSERT INTO @tmp (MyId)
SELECT MyId
FROM CTE

SELECT *
FROM @tmp


Результат:
1
2
...
49
50


CHill60

Хорошее использование рекурсивного CTE. 5

Maciej Los

Спасибо, Кэролайн.

Рейтинг:
0

OriginalGriff

Это, вероятно, очень плохая идея, но - это ваша база данных, которая будет заполнена по крайней мере 562 949 950 000 000 строк, все они дубликаты - так что смотрите здесь: SQL Server: для цикла[^]

Примечание: выполнение операции может занять некоторое время ...


Maciej Los

5ed!