Условный динамический SQL с курсором - PullRequest
1 голос
/ 21 июля 2010

У меня есть запрос, который использует курсор для циклического перебора результатов оператора select.

Короче говоря, оператор select выбирает все записи из имеющейся у меня таблицы сопоставления.Один из столбцов - «SourceTableName».

Я использую это поле для создания динамического SQL.

Я хочу добавить параметр к моей хранимой процедуре, обернутый вокруг этого, что позволит мнесоздать только динамический SQL для «SourceTableName», который я хочу - ЕСЛИ я передаю «SourceTableNameFilter».

Я застрял с некоторой логикой, которая оборачивает мой динамический SQL.(Параметр SP) = @SourceTableName (из таблицы сопоставления) BEGIN

Создание и выполнение некоторого динамического SQL на основе SourceTableName.

Проблема заключается в том, что я хочу, чтобы это работало на всех таблицах, которыевернитесь из выбора против 'SourceTableName' НО, если параметр @SourceTableNameFilter присутствует и не равен нулю - тогда генерируйте динамический SQL только для любых строк в курсоре, которые соответствуют моему параметру фильтра.

Есть ли способ для менясделать это с помощью оператора IF, не копируя логику внутри IF / ELSE дважды?

 FETCH NEXT FROM TABLECUR INTO @SourceTableName
     ,@SourceInColumn
     ,@SourceOutColumn
     ,@TargetTableName
     ,@TargetLookupColumn
     ,@TargetLookupResultColumn
     ,@MappingTableID

 WHILE (@@fetch_status <> -1)
 BEGIN
  IF (@@fetch_status <> -2)
  BEGIN


                IF (@SourceTableName = @SourceTableNameFilter)

                 --GENERATE DYNAMIC SQL

                ELSE 
                 --GENERATE DYNAMIC SQL FOR ALL RECORDS

ГенерироватьСтрока динамического SQL одинакова как в случае if, так и в любом другом, чтобы изменить условия так, чтобы я не дублировал динамическое генерирование SQL и не генерировал динамический SQL, когда @SourceTableName! = @SourceTableNameFilter?

Спасибо

Ответы [ 2 ]

2 голосов
/ 21 июля 2010

Попробуйте добавить эту логику к определению курсора, а не использовать эту логику при обработке каждой записи курсора.

Так что, если курсор обычно:выполнить вашу бизнес-логику в пределах курсора, не обнаруживая отфильтрованную таблицу или нет.Курсор загружен записями, которые вам нужны.Из вопроса звучит, что бизнес-логика одна и та же, независимо от того, был ли введен фильтр или нет.Если это неверно или не соответствует вашим требованиям, пожалуйста, оставьте комментарий.

1 голос
/ 21 июля 2010

Не зная о динамическом sql, который вы создаете, я бы порекомендовал сделать что-то вроде:

SET @DynamicCommand = '<whatever, first part>'
 + isnull(@SourceTableNameFilter
          ,'<no special action, perhaps just empty string>'
          ,'<add conditional text dependent upon contents of @SourceTableNameFilter>')
 + '<whatever, second part>'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...