Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как достать текс запроса из текущей активности?  [new]
a.tarannikova
Member

Откуда:
Сообщений: 153
Мальчики, привет.

sys.dm_exec_sql_text

, при селектах нормально показывается запросы, про при процедурах всместо запроса показывает скрипт на создание этотй процедуры

Подскажите как текст запроса достать, даже при использовании процедур.
20 апр 17, 13:56    [20418713]     Ответить | Цитировать Сообщить модератору
 Re: Как достать текс запроса из текущей активности?  [new]
o-o
Guest
дак привет, исполняется же то, что написано в тексте процедуры.
или надо-то что, индивидуальный стэйтмент выгрести?
20 апр 17, 14:00    [20418734]     Ответить | Цитировать Сообщить модератору
 Re: Как достать текс запроса из текущей активности?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
a.tarannikova,
SELECT
	CASE transaction_isolation_level 
	WHEN 0 THEN 'Unspecified' 
	WHEN 1 THEN 'ReadUncommitted' 
	WHEN 2 THEN 'ReadCommitted' 
	WHEN 3 THEN 'Repeatable' 
	WHEN 4 THEN 'Serializable' 
	WHEN 5 THEN 'Snapshot' END AS ILevel
,       r.session_id
,       requested_memory_MB = x.requested_memory_kb/1000. 
,       granted_memory_MB = x.granted_memory_kb/1000.
,		x.query_cost
,       r.start_time
,	RunTime = DATEDIFF(s,r.start_time,getdate())/60.
,       TotalElapsedTime_min = r.total_elapsed_time/1000./60.
,       r.[status]
,       r.command
,	r.percent_complete
,       DatabaseName = DB_Name(r.database_id)
,       r.wait_type
,       r.last_wait_type
,       r.wait_resource
,       r.cpu_time
,       r.reads
,       r.writes
,       r.logical_reads
,       t.[text] AS [executing batch]
,       SUBSTRING(
                                t.[text], r.statement_start_offset / 2, 
                                (       CASE WHEN r.statement_end_offset = -1 THEN DATALENGTH (t.[text]) 
                                                 ELSE r.statement_end_offset 
                                        END - r.statement_start_offset ) / 2 
                         ) AS [executing statement] 
,       p.query_plan
FROM
        sys.dm_exec_requests r
CROSS APPLY
        sys.dm_exec_sql_text(r.sql_handle) AS t
CROSS APPLY     
        sys.dm_exec_query_plan(r.plan_handle) AS p
LEFT JOIN
	sys.dm_exec_query_memory_grants         x
ON
	x.session_id  = 	r.session_id 
WHERE 
		r.session_id != @@spid       
ORDER BY 
        r.total_elapsed_time DESC;
20 апр 17, 14:02    [20418752]     Ответить | Цитировать Сообщить модератору
 Re: Как достать текс запроса из текущей активности?  [new]
o-o
Guest
	   [individual query] = substring(t.text , r.statement_start_offset / 2 + 1, (
								case
									when r.statement_end_offset = - 1
									then len(convert(nvarchar(max), t.text)) * 2
									else r.statement_end_offset
								end - r.statement_start_offset
								) / 2),

r = sys.dm_exec_requests
t = sys.dm_exec_sql_text(r.sql_handle)
20 апр 17, 14:03    [20418755]     Ответить | Цитировать Сообщить модератору
 Re: Как достать текс запроса из текущей активности?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
a.tarannikova,

Лучше не изобретайте свой велосипед, а используйте уже изобретенный.
Создайте себе процедуру sp_whoisactive и пользуйтесь на здоровье.
20 апр 17, 14:12    [20418810]     Ответить | Цитировать Сообщить модератору
 Re: Как достать текс запроса из текущей активности?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7671
a.tarannikova,

девочки справку и примеры по sys.dm_exec_sql_text читать не умеют?
20 апр 17, 14:33    [20418897]     Ответить | Цитировать Сообщить модератору
 Re: Как достать текс запроса из текущей активности?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31332
a.tarannikova,

только не увлекайтесь dm_exec_sql_text, бывает, что сервер падает из за её использования.
20 апр 17, 15:24    [20419186]     Ответить | Цитировать Сообщить модератору
 Re: Как достать текс запроса из текущей активности?  [new]
o-o
Guest
alexeyvg
сервер падает из за её использования.

примерчик, плиз!
20 апр 17, 15:26    [20419203]     Ответить | Цитировать Сообщить модератору
 Re: Как достать текс запроса из текущей активности?  [new]
a.tarannikova
Member

Откуда:
Сообщений: 153
SomewhereSomehow
a.tarannikova,

Лучше не изобретайте свой велосипед, а используйте уже изобретенный.
Создайте себе процедуру sp_whoisactive и пользуйтесь на здоровье.


мне она не нравится...
20 апр 17, 15:29    [20419219]     Ответить | Цитировать Сообщить модератору
 Re: Как достать текс запроса из текущей активности?  [new]
o-o
Guest
a.tarannikova
SomewhereSomehow
a.tarannikova,

Лучше не изобретайте свой велосипед, а используйте уже изобретенный.
Создайте себе процедуру sp_whoisactive и пользуйтесь на здоровье.


мне она не нравится...

тем, что там есть ХУ?
20 апр 17, 15:31    [20419223]     Ответить | Цитировать Сообщить модератору
 Re: Как достать текс запроса из текущей активности?  [new]
a.tarannikova
Member

Откуда:
Сообщений: 153
o-o
a.tarannikova
пропущено...


мне она не нравится...

тем, что там есть ХУ?


Мне, ХУ везде не мерещатся...


Просто не охото ее устанавливать.
20 апр 17, 15:35    [20419240]     Ответить | Цитировать Сообщить модератору
 Re: Как достать текс запроса из текущей активности?  [new]
o-o
Guest
alexeyvg
a.tarannikova,
только не увлекайтесь dm_exec_sql_text, бывает, что сервер падает из за её использования.

в рекомендуемой SomewhereSomehow sp_whoisactive тоже используется это dmv.
почему-то ни автор, ни комментарии не описывают случаи падения сервера.
поэтому все же повторю свой вопрос,
если не пример, то хотя бы где почитать отзываы пострадавших?
20 апр 17, 15:38    [20419255]     Ответить | Цитировать Сообщить модератору
 Re: Как достать текс запроса из текущей активности?  [new]
o-o
Guest
a.tarannikova
Просто не охото ее устанавливать.

инсталлятор наверное трудные вопросы задает на неведомом языке?
---
а свои процедуры рука не устает "устанавливать"?
20 апр 17, 15:40    [20419276]     Ответить | Цитировать Сообщить модератору
 Re: Как достать текс запроса из текущей активности?  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
a.tarannikova
SomewhereSomehow
a.tarannikova,

Лучше не изобретайте свой велосипед, а используйте уже изобретенный.
Создайте себе процедуру sp_whoisactive и пользуйтесь на здоровье.


мне она не нравится...
Хотелось бы послушать ЗА и ПРОТИВ использования сей многообещающей ХП.
Чота как то руки не дошли ее пощупать.
20 апр 17, 15:41    [20419280]     Ответить | Цитировать Сообщить модератору
 Re: Как достать текс запроса из текущей активности?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31332
o-o
alexeyvg
a.tarannikova,
только не увлекайтесь dm_exec_sql_text, бывает, что сервер падает из за её использования.

в рекомендуемой SomewhereSomehow sp_whoisactive тоже используется это dmv.
почему-то ни автор, ни комментарии не описывают случаи падения сервера.
поэтому все же повторю свой вопрос,
если не пример, то хотя бы где почитать отзываы пострадавших?
Возникает сбой системы управления потоками, "Non-yielding scheduler..."
Мы перегружали сервер из за этого.
Связано не только с dm_exec_sql_text, но вообще с неправильным использованием sql_handle из динамических представлений.
Вот, скажем, баг: https://connect.microsoft.com/SQLServer/feedback/details/700488/non-yielding-scheduler-when-outer-joining-dmvs-with-a-mismatched-on-clause
20 апр 17, 15:49    [20419333]     Ответить | Цитировать Сообщить модератору
 Re: Как достать текс запроса из текущей активности?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
alexeyvg,
Ну, это все-таки не баг sp_whoisacive. Она же использует стандартные dmv. Т.е. нет стаховки от ошибки, если вы будете использовать DMV вместо нее? Хотя я с таким не сталкивался. Процедура удобна, чтобы не писать то, что было написано и протестировано давно - т.е. это не какой-то rocket science и никак без нее нельзя, а просто экономит время.

a.tarannikova,
в таком случае, гугл в помощь.
Можете также открыть код нелюбимой вами процедуры и посмотреть, как она достает данные =)
20 апр 17, 16:36    [20419561]     Ответить | Цитировать Сообщить модератору
 Re: Как достать текс запроса из текущей активности?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31332
SomewhereSomehow
Ну, это все-таки не баг sp_whoisacive. Она же использует стандартные dmv. Т.е. нет стаховки от ошибки, если вы будете использовать DMV вместо нее?
Да, я же и говорил об использовании dm_exec_sql_text, а не о баге в sp_whoisacive

Там статус бага - пофиксен, но не пойму, в каких апдэйтах или сервис-паках. Я сталкивался с ним в 2008R2, и он долго не фиксился.
Вот народ писал через 3 месяца после обещания пофиксить:
автор
Reproduced in both SQL Server 2008 R2 (x64) and SQL Server 2012 RC0 (x64).
Seems like any search against sys.dm_exec_procedure_stats with a non-existant plan_handle gives this error.
20 апр 17, 17:01    [20419653]     Ответить | Цитировать Сообщить модератору
 Re: Как достать текс запроса из текущей активности?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
alexeyvg
Да, я же и говорил об использовании dm_exec_sql_text, а не о баге в sp_whoisacive

А, ну ясно, я, видимо, не так тебя понял.
Не знал, кстати, про этот баг, спасибо за инфу! (мы пока не напарывались на это).
20 апр 17, 17:07    [20419675]     Ответить | Цитировать Сообщить модератору
 Re: Как достать текс запроса из текущей активности?  [new]
o-o
Guest
мы тоже не напарывались, хотя упорно сидели на 2008 R2 SP1.
думаю, давно уже пофиксили
------
говорю только, былo бы особо кривo sys.dm_exec_sql_text,
при том огромном числе использующих sp_whoisactive (использующей sys.dm_exec_sql_text),
было бы странно не увидеть жалобы в комментариях sp_whoisactive.
ведь падение сервера трудно не заметить
20 апр 17, 17:27    [20419748]     Ответить | Цитировать Сообщить модератору
 Re: Как достать текс запроса из текущей активности?  [new]
Eleanor
Member

Откуда:
Сообщений: 2815
SomewhereSomehow,

Как-то на собеседовании упомянула, что использую sp_whoisactive. В ответ мне сказали, что они не пользуются, потому что это небезопасно.
Что они могли иметь в виду? Жаль, не спросила тогда.

Из минусов заметила только то, что на перегруженном сервере лучше использовать отдельные dmv, т.к. sp_whoisactive слишком тяжелая, можно не дождаться ответа.
20 апр 17, 17:29    [20419756]     Ответить | Цитировать Сообщить модератору
 Re: Как достать текс запроса из текущей активности?  [new]
o-o
Guest
Eleanor
Из минусов заметила только то, что на перегруженном сервере лучше использовать отдельные dmv, т.к. sp_whoisactive слишком тяжелая, можно не дождаться ответа.

мне тоже проще соединить нужное,
чем перечислить параметры.
3-4-5 dmv maximum
20 апр 17, 17:32    [20419776]     Ответить | Цитировать Сообщить модератору
 Re: Как достать текс запроса из текущей активности?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4684
a.tarannikova,
может это вам понравиться
-- This query returns log file space used by all running transactions.
select
    SessionTrans.session_id as [SPID],
       percent_complete,
    total_elapsed_time as [Elapsed Time],
    cpu_time as [CPU Time],
    wait_type as [Wait Type],
    wait_time as [Wait Time],
    wait_resource as [Wait Resource],
    reads as [Reads],
    logical_reads as [Logical Reads],
    writes as [Writes],
    granted_query_memory as [Query Memory],
    SUBSTRING(SQLText.text,ExecReqs.statement_start_offset/2,(CASE WHEN ExecReqs.statement_end_offset = -1 then LEN(CONVERT(nvarchar(max), SQLText.text)) * 2 ELSE ExecReqs.statement_end_offset end - ExecReqs.statement_start_offset)/2) AS query_text,
    database_transaction_log_record_count as [Log Records],
    database_transaction_log_bytes_used / 1024 as [Log KB Used],
    database_transaction_log_bytes_reserved / 1024 as [Log KB Reserved],
    database_transaction_log_bytes_used_system / 1024 as [Log KB Used (System)],
    database_transaction_log_bytes_reserved_system / 1024 as [Log KB Reserved (System)],
    database_transaction_replicate_record_count as [Replication Records],
    enlist_count as [Active Requests],
    ActiveTrans.transaction_id as [ID],
    ActiveTrans.name as [Name],
       ActiveTrans.transaction_begin_time as [Start Time],
    case transaction_type
        when 1 then 'Read/Write'
        when 2 then 'Read-Only'
        when 3 then 'System'
        when 4 then 'Distributed'
        else 'Unknown - ' + convert(varchar(20), transaction_type)
    end as [Transaction Type],
    case transaction_state
        when 0 then 'Uninitialized'
        when 1 then 'Not Yet Started'
        when 2 then 'Active'
        when 3 then 'Ended (Read-Only)'
        when 4 then 'Committing'
        when 5 then 'Prepared'
        when 6 then 'Committed'
        when 7 then 'Rolling Back'
        when 8 then 'Rolled Back'
        else 'Unknown - ' + convert(varchar(20), transaction_state)
    end as 'State',
    case dtc_state
        when 0 then NULL
        when 1 then 'Active'
        when 2 then 'Prepared'
        when 3 then 'Committed'
        when 4 then 'Aborted'
        when 5 then 'Recovered'
        else 'Unknown - ' + convert(varchar(20), dtc_state)
    end as 'Distributed State',
    DB.Name as 'Database',
    database_transaction_begin_time as [DB Begin Time],
    case database_transaction_type
        when 1 then 'Read/Write'
       when 2 then 'Read-Only'
        when 3 then 'System'
        else 'Unknown - ' + convert(varchar(20), database_transaction_type)
    end as 'DB Type',
    case database_transaction_state
        when 1 then 'Uninitialized'
        when 3 then 'No Log Records'
        when 4 then 'Log Records'
        when 5 then 'Prepared'
        when 10 then 'Committed'
        when 11 then 'Rolled Back'
        when 12 then 'Committing'
        else 'Unknown - ' + convert(varchar(20), database_transaction_state)
    end as 'DB State',
    command as [Command Type],
    --open_transaction_count as [Open Transactions],
    open_resultset_count as [Open Result Sets],
    row_count as [Rows Returned],
    nest_level as [Nest Level]
from sys.dm_tran_active_transactions ActiveTrans (nolock)
inner join sys.dm_tran_database_transactions DBTrans (nolock) on DBTrans.transaction_id = ActiveTrans.transaction_id
inner join sys.databases DB (nolock) on DB.database_id = DBTrans.database_id
left join sys.dm_tran_session_transactions SessionTrans (nolock) on SessionTrans.transaction_id = ActiveTrans.transaction_id
left join sys.dm_exec_requests ExecReqs (nolock) on ExecReqs.session_id = SessionTrans.session_id and ExecReqs.transaction_id = SessionTrans.transaction_id
outer apply sys.dm_exec_sql_text(ExecReqs.sql_handle) AS SQLText
where SessionTrans.session_id is not null -- comment this out to see SQL Server internal processes
       --AND DB.Name  = 'xxx'
20 апр 17, 17:52    [20419839]     Ответить | Цитировать Сообщить модератору
 Re: Как достать текс запроса из текущей активности?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31332
o-o
мы тоже не напарывались, хотя упорно сидели на 2008 R2 SP1.
думаю, давно уже пофиксили

[quote SomewhereSomehow]
alexeyvg
мы пока не напарывались на это.
Да, повезло, у нас на ответственном и нагруженном продакшене, который мы трогаем после переписок и согласований, проявилось - несколько часов сервер не работал, потом заметили, перезагрузили.
Потом я продолжил смотреть, что же случилось - и опять пришлось перезагружать сервер :-)
И только потом, погуглив по ошибкам из лога, понял, в чём дело.
o-o
говорю только, былo бы особо кривo sys.dm_exec_sql_text,
при том огромном числе использующих sp_whoisactive (использующей sys.dm_exec_sql_text),
было бы странно не увидеть жалобы в комментариях sp_whoisactive.
ведь падение сервера трудно не заметить
Да, это точно.
Может, там в sp_whoisactive это как то учтено? В баге появление ошибки зависит как бы от порядка обращения к разным dmv
То есть, если просто невалидный sql_handle передать в эти функции, то всё нормально, но вот если какой то особенный невалидный, или в каком то порядке...
А в sp_whoisactive какие то хинты расставлены в запросах, в общем, колдовство какое то :-)
Eleanor
sp_whoisactive слишком тяжелая
Я вот поэтому и не использовал.
Обычно самое востребованное - получить, какой стейтмент выполняется в коннектах в данный момент, ну, иногда получить дерево блокировок...
20 апр 17, 19:45    [20420059]     Ответить | Цитировать Сообщить модератору
 Re: Как достать текс запроса из текущей активности?  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2394
Eleanor
не пользуются, потому что это небезопасно.
Что они могли иметь в виду?

ну типа "неизвестный скрипт из интернета, вдруг там прописано if sunday drop all database"
21 апр 17, 12:44    [20421877]     Ответить | Цитировать Сообщить модератору
 Re: Как достать текс запроса из текущей активности?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7671
В справке по sys.dm_exec_sql_text есть пример, "как текст запроса достать, даже при использовании процедур".
21 апр 17, 13:14    [20422052]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить