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

Откуда:
Сообщений: 62
Добрый день!

Может кто знает как посмотреть данные в #темповой таблице чужой сессии.
Такое вообще возможно?
9 сен 10, 10:47    [9409114]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть данные в #темповой таблице чужой сессии  [new]
_djХомяГ
Guest

There are two types of temporary tables:

Local temporary tables
The names of these tables begin with one number sign (#). These tables are visible only to the connection that created them.


9 сен 10, 10:56    [9409212]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть данные в #темповой таблице чужой сессии  [new]
Komil_
Member

Откуда: Ташкент
Сообщений: 304
alexey17000,

Нет, не получится. #Temp доступен только локально. Вот если Вы используете ##Temp тогда другое дело!
9 сен 10, 10:58    [9409226]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть данные в #темповой таблице чужой сессии  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
alexey17000,

версия сервера какая?
9 сен 10, 11:01    [9409253]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть данные в #темповой таблице чужой сессии  [new]
_djХомяГ
Guest
Кстати для 2000 описано тут
(раздел Как вернуть данные из temporary table чужой сессии (только mssql2000))
9 сен 10, 11:26    [9409469]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть данные в #темповой таблице чужой сессии  [new]
alexey17000
Member

Откуда:
Сообщений: 62
Microsoft SQL Server 2005 - 9.00.4294.00 (X64) Apr 15 2010 11:59:31 Copyright (c) 1988-2005 Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 5.2 (Build 3790: Service Pack 2)
9 сен 10, 11:32    [9409528]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть данные в #темповой таблице чужой сессии  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
длязачем вам это понадобилось?
9 сен 10, 11:33    [9409538]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть данные в #темповой таблице чужой сессии  [new]
alexey17000
Member

Откуда:
Сообщений: 62
Проверять правильность выполнения отчетов. Код не мы пишем, поэтому хотелось бы следить
почему отчет висит, нет ли лишних данных в #таблицах.
9 сен 10, 11:39    [9409599]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть данные в #темповой таблице чужой сессии  [new]
Glory
Member

Откуда:
Сообщений: 104751
alexey17000
Проверять правильность выполнения отчетов. Код не мы пишем, поэтому хотелось бы следить
почему отчет висит, нет ли лишних данных в #таблицах.

А если отчет висит из-за блокировки, то причем тут могут быть данные ?
9 сен 10, 11:41    [9409618]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть данные в #темповой таблице чужой сессии  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
alexey17000
Проверять правильность выполнения отчетов. Код не мы пишем, поэтому хотелось бы следить
почему отчет висит, нет ли лишних данных в #таблицах.


а настроить трассу в профайлере и посмотреть?
в конце-концов, можно на ее основе и скриптик соорудить, воспроизводящий.
9 сен 10, 11:43    [9409652]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть данные в #темповой таблице чужой сессии  [new]
alexey17000
Member

Откуда:
Сообщений: 62
Как блокировки смотреть знаю, нужна именно выборка из #таблицы.
9 сен 10, 11:46    [9409715]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть данные в #темповой таблице чужой сессии  [new]
Glory
Member

Откуда:
Сообщений: 104751
alexey17000
Как блокировки смотреть знаю, нужна именно выборка из #таблицы.

Это тупиковый путь. Ищите другой
9 сен 10, 11:48    [9409730]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть данные в #темповой таблице чужой сессии  [new]
alexey17000
Member

Откуда:
Сообщений: 62
точно.

если кому пригодится, можно смотреть кол-во строк в #таблицах use tempdb

SELECT SCHEMA_NAME(schema_id), O.name, ISNULL((select sum(spart.rows) from sys.partitions spart where spart.object_id=O.object_id and spart.index_id < 2),0) AS rows, DS.name, create_date FROM sys.objects O, sys.indexes I, sys.data_spaces DS WHERE O.type IN ('U') AND O.object_id=I.object_id AND I.index_id IN (0,1) AND I.data_space_id = DS.data_space_id AND O.type!='S' ORDER BY 1,2
9 сен 10, 11:53    [9409789]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть данные в #темповой таблице чужой сессии  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
alexey17000
Как блокировки смотреть знаю, нужна именно выборка из #таблицы.


выборку в 2005-ом вы уже никак не сделаете. посмотреть, что там, теоретически, можно, но способ не для слабонервных - dbcc page. устроит? проще нет, поверьте.
9 сен 10, 11:55    [9409822]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть данные в #темповой таблице чужой сессии  [new]
_djХомяГ
Guest
alexey17000
Как блокировки смотреть знаю, нужна именно выборка из #таблицы.

Если так надо - создавайте клон процедуры (с другим именем) Внедряйтесь в код клона - анализируйте #таблицу. Вызывайте с теми же параметрами, как и боевая процедура - посмотрите в том же профайлере. При этом , если вызывается стек процедур, то исправлений в коде для поддержки клона может быть достаточное количество
А вообще
Glory

Это тупиковый путь. Ищите другой
9 сен 10, 11:58    [9409859]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть данные в #темповой таблице чужой сессии  [new]
Богдан Гоцкий
Member

Откуда: Львов
Сообщений: 504
Вот вариант чтения чужих таблиц для всех версий MS SQL:

use master
go
create procedure dbo.sp_ReadTable
(
    @ObjectID int
)
as
begin
    set nocount on
    dbcc traceon(3604) with no_infomsgs

    declare @SQL nvarchar(max)
    set @SQL = 'dbcc ind (' + quotename(db_name()) + ', ' + cast(@ObjectID as varchar(10)) + ', 1) with no_infomsgs';
    declare @pages table(PageFID tinyint, PagePID int, IAMFID tinyint, IAMPID int, ObjectID int, IndexID tinyint, PartitionNumber tinyint, PartitionID bigint, iam_chain_type varchar(30), PageType tinyint, IndexLevel tinyint, NextPageFID tinyint, NextPagePID int, PrevPageFID tinyint, PrevPagePID int, primary key (PageFID, PagePID));
    insert @pages exec(@SQL);

    declare @PageFID smallint, @PagePID int
    declare c cursor for select PageFID, PagePID from @pages where PageType = 1

    declare @t table (ParentObject nvarchar(255), Object nvarchar(255), Field nvarchar(255), Value nvarchar(max))
    create table #res ([0x853A14DF3693C1E3FF10BCA8FD778263] tinyint, [0xFA25E755A0ECDB7FA523E7E9676FF7A9] int, [0xCF523E407CB2A4FB60BE4F7517C047C6] nvarchar(255), [0x6F16A5F8FF5D75AB84C018ADACDFCBB7] nvarchar(255), [0x689202409E48743B914713F96D93947C] nvarchar(max))
/*
    select hashbytes('MD5', 'PageFID')        --0x853A14DF3693C1E3FF10BCA8FD778263
    select hashbytes('MD5', 'PagePID')        --0xFA25E755A0ECDB7FA523E7E9676FF7A9
    select hashbytes('MD5', 'ParentObject')    --0xCF523E407CB2A4FB60BE4F7517C047C6
    select hashbytes('MD5', 'Field')        --0x6F16A5F8FF5D75AB84C018ADACDFCBB7
    select hashbytes('MD5', 'Value')        --0x689202409E48743B914713F96D93947C
*/
    open c
    fetch next from c into @PageFID, @PagePID
    while @@fetch_status = 0
    begin
    
        set @SQL = 'dbcc page (' + quotename(db_name()) + ', ' + cast(@PageFID as varchar(5)) + ', ' + cast(@PagePID as varchar(10)) + ', 3) with tableresults, no_infomsgs'
        insert @t exec(@SQL)
    
        insert #res
        select @PageFID, @PagePID, ParentObject, Field, Value from @t where ParentObject like 'Slot%' and Object like 'Slot%'

        delete from @t

        fetch next from c into @PageFID, @PagePID
    end
    close c
    deallocate c

    dbcc traceoff(3604) with no_infomsgs

    declare @cols nvarchar(max)
    set @cols = stuff((select ',[' + name + ']' from sys.columns where object_id = @ObjectID order by column_id for xml path('')), 1, 1, '')
    set @SQL = 'select ' + @cols + ' from (select [0x853A14DF3693C1E3FF10BCA8FD778263], [0xFA25E755A0ECDB7FA523E7E9676FF7A9], [0xCF523E407CB2A4FB60BE4F7517C047C6], [0x6F16A5F8FF5D75AB84C018ADACDFCBB7], [0x689202409E48743B914713F96D93947C] from #res) t pivot (max([0x689202409E48743B914713F96D93947C]) for [0x6F16A5F8FF5D75AB84C018ADACDFCBB7] in (' + @cols + ')) pvt'
    exec(@SQL)

end
go

Использование:
use tempdb
exec sp_ReadTable 2105058535 /* Object_id темповой таблицы */

P.S. Код написан исключительно ради академического интереса
10 сен 10, 12:58    [9417765]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть данные в #темповой таблице чужой сессии  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Богдан Гоцкий,

на 2000 работать не будет pivot нету
10 сен 10, 13:16    [9418013]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть данные в #темповой таблице чужой сессии  [new]
Glory
Member

Откуда:
Сообщений: 104751
Богдан Гоцкий

Использование:
use tempdb
exec sp_ReadTable 2105058535 /* Object_id темповой таблицы */


А как узнать то этот самый Object_id именно той темповой таблицы, которая мне нужна ?
10 сен 10, 13:18    [9418034]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть данные в #темповой таблице чужой сессии  [new]
Богдан Гоцкий
Member

Откуда: Львов
Сообщений: 504
WarAnt,

да, но pivot легко расписывается через case
10 сен 10, 13:19    [9418045]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть данные в #темповой таблице чужой сессии  [new]
Богдан Гоцкий
Member

Откуда: Львов
Сообщений: 504
Glory,

select * from tempdb..sysobjects where xtype = 'U'

а дальше смотреть глазами на что-то типа
#test_table_________________________________________________________________________________________________________000000000002

где #test_table имя вашей темповой таблицы.
10 сен 10, 13:22    [9418084]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть данные в #темповой таблице чужой сессии  [new]
Glory
Member

Откуда:
Сообщений: 104751
Богдан Гоцкий
Glory,

select * from tempdb..sysobjects where xtype = 'U'

а дальше смотреть глазами на что-то типа
#test_table_________________________________________________________________________________________________________000000000002

где #test_table имя вашей темповой таблицы.

А если у меня куча сессий и в каждой создана своя #test_table ?
10 сен 10, 13:24    [9418106]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть данные в #темповой таблице чужой сессии  [new]
Богдан Гоцкий
Member

Откуда: Львов
Сообщений: 504
Glory,

Я знал что вы зададите этот вопрос :). В таком случае я незнаю как выбрать таблицу из "нужной" сессии. Но что-то придумать, думаю можно. В DBCC LOG заглянуть чтоли...
10 сен 10, 13:27    [9418127]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть данные в #темповой таблице чужой сессии  [new]
проходящий.
Guest
alexey17000
Проверять правильность выполнения отчетов. Код не мы пишем, поэтому хотелось бы следить
почему отчет висит, нет ли лишних данных в #таблицах.
И что мешает взять код, скопировать себе в окно запроса к серверу и оботлаживать его хоть до посинения вместе с просмотром содержимого темповых стабличек? Своих, заметьте!
10 сен 10, 13:28    [9418139]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть данные в #темповой таблице чужой сессии  [new]
g0d
Member

Откуда:
Сообщений: 97
Богдан Гоцкий
Вот вариант чтения чужих таблиц для всех версий MS SQL:

use master
go
create procedure dbo.sp_ReadTable
(
    @ObjectID int
)
as
begin
    set nocount on
    dbcc traceon(3604) with no_infomsgs

    declare @SQL nvarchar(max)
    set @SQL = 'dbcc ind (' + quotename(db_name()) + ', ' + cast(@ObjectID as varchar(10)) + ', 1) with no_infomsgs';
    declare @pages table(PageFID tinyint, PagePID int, IAMFID tinyint, IAMPID int, ObjectID int, IndexID tinyint, PartitionNumber tinyint, PartitionID bigint, iam_chain_type varchar(30), PageType tinyint, IndexLevel tinyint, NextPageFID tinyint, NextPagePID int, PrevPageFID tinyint, PrevPagePID int, primary key (PageFID, PagePID));
    insert @pages exec(@SQL);

    declare @PageFID smallint, @PagePID int
    declare c cursor for select PageFID, PagePID from @pages where PageType = 1

    declare @t table (ParentObject nvarchar(255), Object nvarchar(255), Field nvarchar(255), Value nvarchar(max))
    create table #res ([0x853A14DF3693C1E3FF10BCA8FD778263] tinyint, [0xFA25E755A0ECDB7FA523E7E9676FF7A9] int, [0xCF523E407CB2A4FB60BE4F7517C047C6] nvarchar(255), [0x6F16A5F8FF5D75AB84C018ADACDFCBB7] nvarchar(255), [0x689202409E48743B914713F96D93947C] nvarchar(max))
/*
    select hashbytes('MD5', 'PageFID')        --0x853A14DF3693C1E3FF10BCA8FD778263
    select hashbytes('MD5', 'PagePID')        --0xFA25E755A0ECDB7FA523E7E9676FF7A9
    select hashbytes('MD5', 'ParentObject')    --0xCF523E407CB2A4FB60BE4F7517C047C6
    select hashbytes('MD5', 'Field')        --0x6F16A5F8FF5D75AB84C018ADACDFCBB7
    select hashbytes('MD5', 'Value')        --0x689202409E48743B914713F96D93947C
*/
    open c
    fetch next from c into @PageFID, @PagePID
    while @@fetch_status = 0
    begin
    
        set @SQL = 'dbcc page (' + quotename(db_name()) + ', ' + cast(@PageFID as varchar(5)) + ', ' + cast(@PagePID as varchar(10)) + ', 3) with tableresults, no_infomsgs'
        insert @t exec(@SQL)
    
        insert #res
        select @PageFID, @PagePID, ParentObject, Field, Value from @t where ParentObject like 'Slot%' and Object like 'Slot%'

        delete from @t

        fetch next from c into @PageFID, @PagePID
    end
    close c
    deallocate c

    dbcc traceoff(3604) with no_infomsgs

    declare @cols nvarchar(max)
    set @cols = stuff((select ',[' + name + ']' from sys.columns where object_id = @ObjectID order by column_id for xml path('')), 1, 1, '')
    set @SQL = 'select ' + @cols + ' from (select [0x853A14DF3693C1E3FF10BCA8FD778263], [0xFA25E755A0ECDB7FA523E7E9676FF7A9], [0xCF523E407CB2A4FB60BE4F7517C047C6], [0x6F16A5F8FF5D75AB84C018ADACDFCBB7], [0x689202409E48743B914713F96D93947C] from #res) t pivot (max([0x689202409E48743B914713F96D93947C]) for [0x6F16A5F8FF5D75AB84C018ADACDFCBB7] in (' + @cols + ')) pvt'
    exec(@SQL)

end
go

Использование:
use tempdb
exec sp_ReadTable 2105058535 /* Object_id темповой таблицы */

P.S. Код написан исключительно ради академического интереса


Все здорово. А как наполнить эту временную таблицу?
16 июн 11, 23:32    [10825195]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть данные в #темповой таблице чужой сессии  [new]
g0d
Member

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

Предвидя вопросы типа "зачем?"
http://main.1c-ei.ru/Articles/TypeQurey
16 июн 11, 23:35    [10825206]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить