需要帮忙。消息说临时表不存在:'无效的对象名''TempCodes'。'

时间:2017-07-14 14:54:35

标签: sql-server tsql temp-tables

如果我自己运行下面的select语句(表名是硬编码的),它运行正常并创建临时表。如果我按下面的说法运行它会显示“无效的对象名称'#TempCodes'',但是当我打印@ Sql1时,它看起来与我自己运行它时的情况完全相同(表格名称是硬编码的)。

任何关于这里发生的事情的想法都将受到赞赏。

DECLARE @TableName NVARCHAR(50)
SET @TableName = '[My Table Name]'
DECLARE @Sql1 NVARCHAR(MAX);
SET @Sql1 = N'SELECT  AccountNumber,LTRIM(RTRIM(m.n.value(''.[1]'',''varchar(8000)''))) AS mdcodes INTO #TempCodes FROM (SELECT AccountNumber,CAST(''<XMLRoot><RowData>''
    + REPLACE(MD_Results,'','',''</RowData><RowData>'') 
    + ''</RowData></XMLRoot>'' AS XML) AS x FROM  ' + @TableName 
    + N')t CROSS APPLY x.nodes(''/XMLRoot/RowData'')m(n)'

IF OBJECT_ID('tempdb.dbo.#TempCodes', 'U') IS NOT NULL 
BEGIN
   drop table  #TempCodes
END 

EXECUTE sp_executesql @Sql1
Select * from #TempCodes

2 个答案:

答案 0 :(得分:1)

我相信##是一个错字。即使您将其修复为#,也会产生相同的错误。

EXECUTE sp_executesql @Sql1
  

删除在存储过程中创建的本地临时表   存储过程完成后自动完成。

在您的情况下,sp_executesql是存储过程。

exec sp_executesql完成后,将删除在动态查询中创建的表。这就是你得到这个错误的原因。

您需要在外部创建表并在动态查询

中使用Insert into table..select语法
IF OBJECT_ID('tempdb.dbo.#TempCodes', 'U') IS NOT NULL 
   drop table  #TempCodes

create table #TempCodes(AccountNumber varchar(100),mdcodes varchar(100))

SET @Sql1 = N'Insert into #TempCodes
              SELECT  AccountNumber,LTRIM(RTRIM(m.n.value(''.
[1]'',''varchar(8000)''))) AS mdcodes FROM (SELECT 
AccountNumber,CAST(''<XMLRoot><RowData>'' + 
REPLACE(MD_Results,'','',''</RowData><RowData>'') + ''</RowData></XMLRoot>'' 
AS XML) AS x FROM  '+@TableName+ N')t CROSS APPLY 
x.nodes(''/XMLRoot/RowData'')m(n)'

答案 1 :(得分:0)

尝试使用全局临时表##TempCodes,因为本地临时表仅在当前会话中可见。

DECLARE @TableName NVARCHAR(50)
SET @TableName = '[My Table Name]'
DECLARE @Sql1 NVARCHAR(MAX);
SET @Sql1 = N'SELECT  AccountNumber,LTRIM(RTRIM(m.n.value(''.
[1]'',''varchar(8000)''))) AS mdcodes INTO ##TempCodes FROM (SELECT 
AccountNumber,CAST(''<XMLRoot><RowData>'' + 
REPLACE(MD_Results,'','',''</RowData><RowData>'') + ''</RowData></XMLRoot>'' 
AS XML) AS x FROM  '+@TableName+ N')t CROSS APPLY 
x.nodes(''/XMLRoot/RowData'')m(n)'
IF OBJECT_ID('tempdb.dbo.##TempCodes', 'U') IS NOT NULL 
            BEGIN
            drop table  ##TempCodes
            END 
EXECUTE sp_executesql @Sql1

Select * from ##TempCodes