Отладка T-SQL в MSVS 2013
От: SergASh  
Дата: 02.04.15 11:32
Оценка:
Привет всем!

Дано:
MSVS 2013 Update 3
SQL Server 2014 Developer
Windows 8.1 x64

Пытаюсь пройтись отладчиком по хранимой процедуре, которая использует табличные переменные.
Как посмотреть что в этих переменных? Прямого способа по всей видимости нет. Студия в окне Watch
для таких переменных ничего не показывает.
Но может можно как-то добраться до содержимого через системные таблицы или dmv?

Спасибо.
Re: Отладка T-SQL в MSVS 2013
От: BlackEric http://black-eric.lj.ru
Дата: 02.04.15 11:37
Оценка:
Здравствуйте, SergASh, Вы писали:

SAS>Пытаюсь пройтись отладчиком по хранимой процедуре, которая использует табличные переменные.

SAS>Как посмотреть что в этих переменных? Прямого способа по всей видимости нет. Студия в окне Watch
SAS>для таких переменных ничего не показывает.
SAS>Но может можно как-то добраться до содержимого через системные таблицы или dmv?

SAS>Спасибо.


А просто сделать select * from @t1?
https://github.com/BlackEric001
Re[2]: Отладка T-SQL в MSVS 2013
От: SergASh  
Дата: 02.04.15 11:50
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>А просто сделать select * from @t1?


Мысль я не уловил. Если вы предлагаете вставить этот select в код процедуры, то это не подходит.
Во-первых это нарушит работу клиента. Он ожидает определенные recordset'ы в определенном порядке.
Во-вторых, студия все равно не покажет результат в отладчике. Ну и менять хранимки всякий раз только
чтобы переменную посмотреть замучаешься.

Тут штука в том, что мне мало просто запустить ХП. Иначе я бы просто взял ее код отдельно, расставил бы
там эти select'ы и выполнил бы в SSMS. Нужно на нее посмотреть когда она вызвана из клиента. Там нехилый
call stack, и воспроизвести весь контекст руками о-о-очень сложно.
Re[3]: Отладка T-SQL в MSVS 2013
От: BlackEric http://black-eric.lj.ru
Дата: 02.04.15 13:15
Оценка:
Здравствуйте, SergASh, Вы писали:

SAS>Тут штука в том, что мне мало просто запустить ХП. Иначе я бы просто взял ее код отдельно, расставил бы

SAS>там эти select'ы и выполнил бы в SSMS. Нужно на нее посмотреть когда она вызвана из клиента. Там нехилый
SAS>call stack, и воспроизвести весь контекст руками о-о-очень сложно.

Другого варианта просто нет. Отладка хранимых процедур в MS Visual Studio.
https://github.com/BlackEric001
Re[4]: Отладка T-SQL в MSVS 2013
От: Sinix  
Дата: 02.04.15 13:29
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>Другого варианта просто нет. Отладка хранимых процедур в MS Visual Studio.


Не, есть ещё To XML, но он немногим лучше.

Как вариант, могу посоветовать постгре. После борьбы с эпическими костылями для всего, начиная с профайлинга, MS SQL ещё неплохо смотрится.
Re: Отладка T-SQL в MSVS 2013
От: Olaf Россия  
Дата: 02.04.15 17:09
Оценка: 24 (2)
Здравствуйте, SergASh, Вы писали:

SAS>Привет всем!


SAS>...


SAS>Пытаюсь пройтись отладчиком по хранимой процедуре, которая использует табличные переменные.

SAS>Как посмотреть что в этих переменных? Прямого способа по всей видимости нет. Студия в окне Watch
SAS>для таких переменных ничего не показывает.
SAS>Но может можно как-то добраться до содержимого через системные таблицы или dmv?

SAS>Спасибо.


Можно попробовать экзотический вариант с помощью подручных средств. Берем скрипт от Fabiano Amorim здесь и запускаем на БД tempdb. Он создает ХП, которая используя dbcc ind и dbcc page читает данные напрямую через страницы данных. Аналогичных реализаций большое количество, я просто помню только этот вариант. Далее необходимо правильно идентифицировать вашу табличную переменную, для этого можно воспользоваться запросом.

select t.name,
      t.object_id,
       p.rows
from tempdb.sys.tables t
join tempdb.sys.partitions p on p.object_id = t.object_id


Скрипт может усложниться по условиям поиска, в зависимости от того как вы используете сервер. Мне на домашнем компьютере было его достаточно, тем более я ориентировался на количество строк, которое знал заранее. Так же важно, чтобы табличная переменная существовала во время выполнения скрипта, т.е. стояла точка прерывания, задержка или еще что-то, другими словами не было выхода за пределы видимости и уничтожения переменной.
После того как объект удалось иденитфицировать, вызваем главный запрос и получаем данные. Параметр количество страниц @Qtde_Pages можно задать побольше.

declare @i int
set @i = -1080663366

exec dbo.st_SelectPAGEs @Object_ID = @i, @Qtde_Pages = 10000

Все вышесказанное опробовал лично на сервере 2014 Express Edition.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.