Мне нужно перебрать каждое значение в #TempTable и использовать это значение в качестве параметра для MyFunction

Функция MyFunction просто возвращает другой столбец на основе ID_col в #TempTable

IF OBJECT_ID('tempdb..#TempTable') IS NOT NULL DROP TABLE #TempTable
select 'ID1' as ID_col
into #TempTable
union select all 'ID2'
union select all 'ID3'

DECLARE @PriorID_col varchar(50)
DECLARE @ReturnVal varchar(50) = ''

SELECT TOP 1 PriorID_col = #TempTable.ID_col

-- here I need to loop through each ID_col in #TempTable and supply it as a parameter to "MyFunction"
WHILE MyFunction(#TempTable.ID_col) IS NOT NULL 
 BEGIN
        SET @PriorID_col = MyFunction(@PriorID_col)
    END
-- quering ID from real table based on variable @PriorID_col
SELECT TOP 1 @ReturnVal = ID
FROM         MyTable
WHERE        MyTable.ID = @PriorID_col

Но я не могу перебрать каждое значение в #TempTable. Что я здесь делаю не так?

-1
Serdia 2 Сен 2020 в 23:49

2 ответа

Лучший ответ

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

В любом случае я показал основную предпосылку для перебора строк во временной таблице. По сути ...

  1. Получите верхний ряд
  2. Сделай что-нибудь с этим
  3. Удалите это
IF OBJECT_ID('tempdb..#TempTable') IS NOT NULL DROP TABLE #TempTable;

SELECT 'ID1' AS ID_col
INTO #TempTable
UNION ALL SELECT 'ID2'
UNION ALL SELECT 'ID3';

DECLARE @ID_col VARCHAR(50), @PriorID_col VARCHAR(50), @ReturnVal VARCHAR(50) = '';

-- here I need to loop through each ID_col in #TempTable and supply it as a parameter to "MyFunction"
WHILE EXISTS (SELECT 1 FROM #TempTable.ID_col)
BEGIN
    SELECT TOP 1 @ID_col = ID_col #TempTable.ID_col;
    SET @PriorID_col = dbo.MyFunction(@ID_col)
    DELETE FROM #TempTable.ID_col WHERE ID_col = @ID_col
END;

-- quering ID from real table based on variable @PriorID_col
SELECT TOP 1 @ReturnVal = ID
FROM MyTable
WHERE MyTable.ID = @PriorID_col;
1
Dale K 9 Сен 2020 в 23:13

Просто интересно, не сработает ли простой SELECT ... WHERE для этого сценария.

SELECT 'ID1' AS ID_col
INTO #TempTable
UNION ALL SELECT 'ID2'
UNION ALL SELECT 'ID3';

SELECT *
FROM MyTable
WHERE MyTable.Id IN (SELECT MyFunction(@ID_col) FROM #TempTable)
0
Fabio 2 Сен 2020 в 23:15