Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > Проблемы с sp_executesql + #tmp_table


Автор: sergey_85 2.3.2011, 07:38
Привет!

У меня такая ситуация: Есть процедура p311_kich_LoadFilteredMsgs, в которой идет выполнение sql через sp_executesql, далее после выполнения sp_executesql ниже следует инструкция exec [dbo].[p311_kich_LoadMsgs], в которой используется временная таблица, созданная в sp_executesql.

В ответ на запрос выдается следующая ошибка: 
Код

[Microsoft][ODBC SQL Server Driver][SQL Server]Invalid object name '#tmp_p311_LoadMsgs'.


Но, когда я помещаю выполнение exec [dbo].[p311_kich_LoadMsgs] в sp_executesql, то все работает!!?
Странно, потому что при выполнени запроса я использую одно соединение и временная таблица должна быть видна!

хотелось бы узнать в чем дело?

выдает ошибку
Код

set @sql3 = 'select top 500 m.ID into #tmp_p311_LoadMsgs' + 
    'from tla_MessOpenCloseAcc        m (nolock)' + 
    'join top_Chains                    c (nolock)    on c.ID = m.IDChain' +
    'join #tmp_p311_LoadFilteredMsgs    t            on t.State = isnull(m.FSSState, 0)' +
    'where ' +
        '(@dBegin is null or case @WhichDate when 0 then m.DateOper when 1 then c.Date end >= @dBegin) and' +
        '(@dEnd     is null or case @WhichDate when 0 then m.DateOper when 1 then c.Date end <= @dEnd    ) and' +
        'm.IDAccount = isnull(@IDAccount, m.IDAccount) and' +
        'm.IDClient = isnull(@IDClient, m.IDClient) --exec [dbo].[p311_kich_LoadMsgs]' 

if @stateType = 0
begin
    EXEC sp_executesql 
    @sql0, 
    N'@WhichDate    tinyint , @dBegin smalldatetime, @dEnd    smalldatetime, @IDAccount T_CBIdent, @IDClient ClientID', 
    @WhichDate= @WhichDate, @dBegin = @dBegin, @dEnd=@dEnd, @IDAccount=@IDAccount, @IDClient=@IDClient

    exec [dbo].[p311_kich_LoadMsgs]  
end


а так все ок!
Код

set @sql3 = 'select top 500 m.ID into #tmp_p311_LoadMsgs' + 
    'from tla_MessOpenCloseAcc        m (nolock)' + 
    'join top_Chains                    c (nolock)    on c.ID = m.IDChain' +
    'join #tmp_p311_LoadFilteredMsgs    t            on t.State = isnull(m.FSSState, 0)' +
    'where ' +
        '(@dBegin is null or case @WhichDate when 0 then m.DateOper when 1 then c.Date end >= @dBegin) and' +
        '(@dEnd     is null or case @WhichDate when 0 then m.DateOper when 1 then c.Date end <= @dEnd    ) and' +
        'm.IDAccount = isnull(@IDAccount, m.IDAccount) and' +
        'm.IDClient = isnull(@IDClient, m.IDClient) exec [dbo].[p311_kich_LoadMsgs]' 

if @stateType = 0
begin
    EXEC sp_executesql 
    @sql0, 
    N'@WhichDate    tinyint , @dBegin smalldatetime, @dEnd    smalldatetime, @IDAccount T_CBIdent, @IDClient ClientID', 
    @WhichDate= @WhichDate, @dBegin = @dBegin, @dEnd=@dEnd, @IDAccount=@IDAccount, @IDClient=@IDClient

    --exec [dbo].[p311_kich_LoadMsgs]  
end


ps: sql server 2000 

Автор: metis 24.3.2011, 10:21
Может надо вместо 
Код

EXEC sp_executesql 
    @sql0, 

написать 
 
Код

EXEC sp_executesql 
    @sql3 , 


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)