Действительно ли возможно выполнить хранимую процедуру по набору, не используя курсор?

В моем случае единственным вариантом было удалить виртуальную машину и загрузить ее снова. Никакая переконфигурация адаптера только для хоста не помогла, я использовал другую адресацию DHCP. Virtual Box I обновлен до версии 4.3.4 и Genymotion до 2.0.2

19
задан Andy Mikula 10 July 2009 в 16:37
поделиться

5 ответов

9 из 10 раз можно сделать то, что Вы хотите без курсора или некоторое время цикла. Однако, если необходимо использовать один, я нашел, что циклы с условием продолжения имеют тенденцию быть быстрее.

Также, если Вы не хотите удалять или обновлять таблицу, можно использовать что-то вроде этого:

DECLARE @id [type]
SELECT @id = MIN([id]) FROM [table]
WHILE @id IS NOT NULL
BEGIN
    EXEC [sproc] @id
    SELECT @id = MIN([id]) FROM [table] WHERE [id] > @id
END
0
ответ дан 30 November 2019 в 03:34
поделиться

Да. Если у Вас есть столбец, можно использовать в таблице для маркировки тех обработанных, можно использовать, В ТО ВРЕМЯ КАК СУЩЕСТВУЕТ:

DECLARE @Id int
WHILE EXISTS(SELECT * FROM Table1 WHERE Processed='N')
BEGIN
 SELECT Top 1 @Id = id from Table1 WHERE Procesed='N'
 EXEC dbo.Sproc @Id
 UPDATE Table1 SET Processed = 'Y' WHERE Id = @Id
END

Поочередно, выведите идентификаторы во временную таблицу или табличную переменную и удалите по окончании:

DECLARE @HoldTable table (Id int PRIMARY KEY)
DECLARE @Id int
INSERT INTO @HoldTable SELECT Id FROM Table1
WHILE EXISTS(SELECT * FROM @HoldTable)
BEGIN
 SELECT @Id = id from @HoldTable
 EXEC dbo.Sproc @Id
 DELETE FROM @HoldTable where Id = @Id
END
18
ответ дан 30 November 2019 в 03:34
поделиться

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

, Если это не возможно, чем, Вам, вероятно, не повезло.

1
ответ дан 30 November 2019 в 03:34
поделиться

Откровенно, если я должен был выполнить сохраненный proc для ряда данных вместо этого, если бы одна запись, для которой это было записано, я написал бы основанный на наборе код вместо того, чтобы использовать сохраненный proc. Это - единственный эффективный способ сделать это, если Вы собираетесь быть выполнением против большого набора данных. Вы могли пойти с часов, чтобы сделать вставку, которую сохраненный proc делает к секундам или даже миллисекундам. Не используйте основанную на записи обработку никогда, когда необходимо будет обработать ряд данных особенно не по глупой причине как повторное использование кода. Производительность превосходит повторное использование кода.

3
ответ дан 30 November 2019 в 03:34
поделиться

Если Вы только используете SQL Server 2005 или более новые, не заботьтесь о назад совместимости, и может преобразовать Ваш код, чтобы быть в Пользовательской Функции (а не сохраненный proc) затем, можно использовать новый оператор "CROSS APPLY", который действительно использует синтаксис, очень похожий на то, что Вы хотите. Я нашел здесь короткое введение (конечно, можно также считать BOLs и MSDN)

предположим, SP возвращает единственное значение, названное out_int, пример мог быть переписан как:

SELECT T.id, UDF.out_int
FROM 
    Table1 T
CROSS APPLY
    dbo.fn_My_UDF(T.id) AS UDF

Это будет получать каждый "идентификатор" от Table1 и использовать его для вызова fn_My_UDF, результат которого появится в заключительном наборе результатов помимо исходного параметра.

варьируемая величина А "КРЕСТА ПРИМЕНЯЕТСЯ", является "ВНЕШНИМ, ПРИМЕНЯЮТСЯ". Они - эквиваленты "ВНУТРЕННЕГО ОБЪЕДИНЕНИЯ" и "ОСТАВЛЕННЫЙ СОЕДИНЕНИЕ", но работу над присоединением к таблице и UDF (и вызов второго одновременно).

, Если Вы должны (согласно явному порядку босса с заостренными волосами) используют SPS insead, хорошо - неудача! Необходимо будет оставаться с курсорами или попытаться обмануть немного: измените код в UDFs и создайте SPS обертки :D.

14
ответ дан 30 November 2019 в 03:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: