Перебирайте строки таблицы и вызывайте хранимую процедуру в каждой строке - PullRequest
0 голосов
/ 08 июня 2018

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

Моя проблема в том, что я не настолько тверд с такими заявлениями SQL.Кто-нибудь может дать мне несколько подсказок или умных слов для работы?

Может быть, какой-нибудь псевдокод (c #) поможет вам понять мою проблему

foreach(var row in tableRows)  {
 var processedValue = ProcessColumn(row.columnToBeProcessed)  
 InsertIntoResultTable(row.column1, row.column2, processedValue
}

Так что я хочу достичь, это новая таблица собработанное значение для каждой строки и некоторые исходные данные из этой строки

Ответы [ 3 ]

0 голосов
/ 08 июня 2018

Ближайшая вещь к C # foreach в SQL Server будет CURSOR.Это позволяет вам выполнять отдельные операции над набором данных.Тем не менее, используйте курсоры экономно.Их следует избегать везде, где это возможно, поскольку они неэффективны по сравнению с операциями на основе множеств, которые вы обычно выполняете в запросе SQL.

Другой альтернативой, если это возможно, является использование пользовательских функций в сочетании сCROSS APPLY или OUTER APPLY, вот так:

SELECT TableRows.Column1, TableRows.Column2, func.ProcessedValue
FROM TableRows
CROSS APPLY dbo.fn_DataProcessingFunction(TableRows.ColumnToBeProcessed) AS func;
0 голосов
/ 08 июня 2018

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

CREATE FUNCTION dbo.ProcessColumn (@Column)
RETURN NUMERIC
BEGIN
     --Your process here,
     --this is some example
    DECLARE @var numeric
    SET @var = @column + 1
    RETURN @var
END

И затем применить его в SELECT STATEMENT

INSERT INTO TABLE1 (Column1, Column2, ProcessedColumn)

SELECT Column1, Column2, 
 --this is your function, with column of the table
 -- as parameter to be processed
     dbo.ProcessColumn(Column3)
FROM TABLESOURCE
0 голосов
/ 08 июня 2018

Как правило, вы хотите ИЗБЕЖАТЬ построчных операторов в sql (поиск RBAR) и вместо этого выполнять операцию set.Попробуйте что-то вроде:

Insert Into ResultTable (
    column1, 
    column2, 
    processedValue)
select 
    ot.column1, 
    ot.column2, 
    yourFunction(ot.column3) AS ProcessedValue
from 
    originalTable ot
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...