Eu tenho um problema com EXECUTE sp_executesql e estou preso a ele. minha dúvida é a seguinte
DECLARE @TABLE_NAME VARCHAR(5)='#T' DECLARE @TABLE_ID INTEGER=0 DECLARE @QRY NVARCHAR(MAX) ='' DECLARE @TABLE VARCHAR(3) DECLARE CRSR_WAGES CURSOR FOR SELECT Code,Name , ROW_NUMBER() OVER (ORDER BY U_Prrty, DocEntry) Slno, COUNT(Code) OVER (PARTITION BY OBJECT) ColNos FROM [@CCS_WAGE] WHERE U_DISPP = 'Y' AND U_DEDWT='E' OPEN CRSR_WAGES FETCH NEXT FROM CRSR_WAGES INTO @WAGECOD,@WAGE_DESC,@SI_NO,@COL_NOS WHILE @@FETCH_STATUS=0 BEGIN SET @TABLE=@TABLE_NAME+CONVERT(VARCHAR(2),@TABLE_ID) SELECT @TABLE AS 'TABLE' SET @QRY='(SELECT empno, amt AS '+'['+@WAGE_DESC+']' SET @QRY=@QRY+' INTO '+@TABLE SET @QRY=@QRY+' FROM CCS_PYMONTHRESULT WHERE wgcod='''+@WAGECOD+''')' SELECT @QRY EXECUTE sp_executesql @QRY SET @TABLE_ID=@TABLE_ID+1 DECLARE @STAR AS NVARCHAR(50)='SELECT * FROM ' + @TABLE SELECT @STAR EXECUTE sp_executesql @STAR FETCH NEXT FROM CRSR_WAGES INTO @WAGECOD,@WAGE_DESC,@SI_NO,@COL_NOS END CLOSE CRSR_WAGES DEALLOCATE CRSR_WAGES
mas o problema é quando executar esta mensagem de erro vem como este nome de objeto inválido '#T0'. Nome de objeto inválido '#T1'. Nome de objeto inválido '#T2'.
Supondo que as tabelas temporárias que você está referenciando existam, seu problema é o escopo da sessão. As tabelas temporárias marcadas com um único
#
são visíveis para a sessão em que são criadas, elas também são conhecidas como tabelas temporárias locais.O problema que você tem é que, quando você executa um sql dinâmico, ele é executado em uma nova sessão - portanto, essa sessão não pode ver as tabelas temporárias que você criou.
Para corrigir o problema, você pode fazer uma das três coisas:
##
como estes são visíveis em todas as sessõessp_executesql
Espero que isso ajude você.
O SQL dinâmico é executado na mesma sessão que o código de chamada. A questão não é a sessão, mas o escopo. Seu SQL dinâmico cria as tabelas temporárias dentro da
sp_executesql
chamada e assim a tabela #temp criada só fica visível dentro dessasp_executesql
chamada, conforme documentado no MSDN:Então você precisa reter a tabela #temp em um escopo que abranja tanto a criação quanto o uso, por exemplo (também corrigiu os problemas de injeção de SQL que você tinha e passou
@WAGECODE
como parâmetro):Escusado será dizer que este é um uso desnecessário de tabelas #temp, você pode simplesmente selecionar o resultado que deseja e ligar para ti um dia, não há necessidade de tabelas #temp: