Я пытаюсь достичь чего-то по принципу «для каждого», где я хотел бы взять идентификаторы возвращенного оператора выбора и использовать каждый из них.
DECLARE @i int
DECLARE @PractitionerId int
DECLARE @numrows int
DECLARE @Practitioner TABLE (
idx smallint Primary Key IDENTITY(1,1)
, PractitionerId int
)
INSERT @Practitioner
SELECT distinct PractitionerId FROM Practitioner
SET @i = 1
SET @numrows = (SELECT COUNT(*) FROM Practitioner)
IF @numrows > 0
WHILE (@i <= (SELECT MAX(idx) FROM Practitioner))
BEGIN
SET @PractitionerId = (SELECT PractitionerId FROM @Practitioner WHERE idx = @i)
--Do something with Id here
PRINT @PractitionerId
SET @i = @i + 1
END
На данный момент у меня есть что-то похожее на выше, но я получаю ошибку:
Неверное имя столбца 'idx'.
Может ли кто-то
sql-server
tsql
Помстер
источник
источник
idx
в@Practitioner
нетPractitioner
. Чаще всего существуют подходящие альтернативы для каждого подхода, основанные на множествах, если вы показываете, что делаете со значением строки, возможно, можно предложить альтернативу.--Do something with Id here
это, то, скорее всего, мы сможем показать вам, как решить эту проблему без каких-либо циклов или курсоров. В большинстве случаев вы хотите использовать решение на основе множеств, поскольку именно так SQL Server оптимизирован для работы. Цикл и обработка одного ряда за раз, безусловно, имеют свое место, но я подозреваю, что это не так.Ответы:
Вы, кажется, хотите использовать
CURSOR
. Хотя в большинстве случаев лучше использовать решение на основе множеств, в некоторых случаяхCURSOR
наилучшим решением является a . Не зная больше о вашей реальной проблеме, мы не можем помочь вам больше, чем это:источник
Предположим, что столбец PractitionerId является уникальным, тогда вы можете использовать следующий цикл
источник
Ваш выбор счетчика и выбор макс должен быть из вашей табличной переменной вместо фактической таблицы
источник
Это обычно (почти всегда) работает лучше, чем курсор и проще:
источник
Я бы сказал, что, вероятно, все работает, за исключением того, что столбец
idx
фактически не существует в таблице, из которой вы выбираете. Может быть, вы хотели выбрать из@Practitioner
:потому что это определено в приведенном выше коде так:
источник
Следующая строка неверна в вашей версии:
(Отсутствует @)
Может быть, идея изменить соглашение об именах, чтобы таблицы были более разными.
источник
Хотя курсоры обычно считаются ужасным злом, я считаю, что это относится к курсору FAST_FORWARD - ближе всего к FOREACH в TSQL.
источник
Я сделал процедуру, которая выполняет
FOREACH
сCURSOR
для любой таблицы.Пример использования:
Результат 2 выбора для каждой строки. Синтаксис
UPDATE
и разбиениеFOREACH
написаны в подсказках.Это код процедуры:
источник
Я придумал очень эффективный (я думаю) читабельный способ сделать это.
Вот код Извините, вместо имен в вопросе используются мои имена переменных.
источник
Вот одно из лучших решений.
Мы можем получить доступ или сделать что угодно в теле цикла, и мы можем получить доступ к idx, определив его внутри определения таблицы.
источник