T-SQL: как запрашивать / просматривать / проверять / отслеживать данные во временных таблицах / табличных переменных, используемых в SP (хранимая процедура) - PullRequest
0 голосов
/ 24 мая 2018

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

Я хотел бы иметь такую ​​же возможность при разработке или поиске и устранении неисправностей / пошаговой отладке SP.

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

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

Кто-нибудь знает, есть ли другой более простой подход?

Ответы [ 3 ]

0 голосов
/ 24 мая 2018

PRINT ничего не выводит, пока процесс не закончится.В подобных обстоятельствах вы можете использовать RAISERROR WITH NOWAIT , который немедленно выведет сообщение.

например,

RAISERROR ('Now that''s what I call a message!', 0, 1) WITH NOWAIT
0 голосов
/ 25 мая 2018

И решение:

https://github.com/FilipDeVos/sp_select

Отличный материал!

0 голосов
/ 24 мая 2018

Если вы можете разбить код на пакеты, вы можете использовать PRINT операторы повсюду.

Простой пример ... запустите это и убедитесь, что вы нажали на вкладку «Сообщения» сразу после запуска.

select 1 as 'a' into #t
print '#t table pouplated'
go

--simulate some heavy queries taking some time
waitfor delay '00:00:05'
select 2 as b into #t2

print '#t2 table pouplated'
go

SQL Server также имеет отладчик

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

declare @logToTable bit = 1

select 1 as 'a' into #t

if @logToTable = 1
begin
   insert into logTable (status_msg, log_date)
   values
   ('#t populated',getdate())
end

--simulate some heavy queries taking some time

waitfor delay '00:00:05'


select 2 as b into #t2

if @logToTable = 1
begin
   insert into logTable (status_msg, log_date)
   values
   ('#t2 populated',getdate())
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...