Отладка подзапросов в хранимой процедуре TSQL - PullRequest
0 голосов
/ 22 июня 2011

Как отладить сложный запрос с несколькими вложенными подзапросами в SQL Server 2005?

Я отлаживаю хранимую процедуру и триггер в Visual Studio 2005. Мне бы хотелось иметь возможность увидеть, каковы результаты этих подзапросов, так как я чувствую, что именно отсюда и происходит ошибка. Пример запроса (слегка отредактированный) ниже:

UPDATE
               foo
          SET
               DateUpdated = ( SELECT TOP 1 inserted.DateUpdated FROM inserted )
              ...
          FROM
               tblEP ep
               JOIN tblED ed ON ep.EnrollmentID = ed.EnrollmentID
          WHERE
               ProgramPhaseID = ( SELECT ...)

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

В любом случае я могу добавить часы или каким-либо другим способом просмотреть эти подзапросы? Я был бы рад, если бы был какой-то способ «войти в» сам запрос, но я думаю, что это было бы невозможно.

Ответы [ 2 ]

1 голос
/ 23 июня 2011

Хорошо, во-первых, я бы не хотел использовать подзапросы в триггере.Триггеры должны быть максимально быстрыми, поэтому избавьтесь от любых коррелированных подзапросов, которые могут выполняться построчно, а не на основе набора.Переписать, чтобы присоединиться.Если вы хотите обновить записи только на основе того, что было в вставленной таблице, присоединитесь к ней.Также присоединитесь к таблице, которую вы обновляете.Что именно вы пытаетесь достичь с помощью этого триггера?Может быть проще дать совет, если мы поняли бизнес-правило, которое вы пытаетесь реализовать.

Для отладки триггера это то, что я делаю.

Я пишу скрипт для:

  1. Выполнить фактическую вставку в таблицу без триггера на нем
  2. Создать временную таблицу с именем #inserted (и / или одну с именем #deleted)
  3. Заполните таблицу так, как я ожидал бы, что вставленная таблица в триггере будет заполнена из вставки, которую вы делаете.
  4. Добавить код триггера (за исключением создания или изменения частей триггера), заменяя #inserted каждый раз, когда я вставляю ссылку.(если вы планируете запускаться несколько раз, пока не будете готовы использовать его в триггере, добавьте его в явную транзакцию и выполните откат после проверки результатов.
  5. Добавьте запрос для проверки таблиц, которые вы изменяетес триггером для значений, которые вы хотите изменить.
  6. Теперь, если вам нужно добавить операторы отладки, чтобы увидеть, что происходит между шагами, вы можете сделать это.
  7. Запускайте внесение изменений, пока не получитетребуемые результаты.
  8. Как только запрос будет работать так, как вы ожидаете, легко снять вставленные знаки # и использовать его для создания тела триггера.
0 голосов
/ 22 июня 2011

Это то, что я обычно делаю в этом типе scenerio: распечатывать точные sqls, генерируемые каждым подзапросом, затем запускайте каждый из них в Management Studio, как предложено выше.Вы должны проверить, дают ли различные детали правильные данные, которые вы ожидаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...