Sql server 我需要帮助。消息说临时表不存在:“无效的对象名称”“临时代码”。”

Sql server 我需要帮助。消息说临时表不存在:“无效的对象名称”“临时代码”。”,sql-server,tsql,temp-tables,Sql Server,Tsql,Temp Tables,如果我单独运行下面的select语句,其中包含硬编码的表名,则该语句运行良好,并创建临时表。如果我按如下方式运行它,它会显示“无效对象名”TempCodes,尽管当我打印@Sql1时,它看起来与我使用硬编码的表名单独运行时完全相同 任何关于这里发生的事情的想法都将不胜感激 DECLARE @TableName NVARCHAR(50) SET @TableName = '[My Table Name]' DECLARE @Sql1 NVARCHAR(MAX); SET @Sql1 = N'SEL

如果我单独运行下面的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

尝试使用全局临时表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
我认为这是一个打字错误。即使你修正了它,它也会抛出同样的错误

EXECUTE sp_executesql @Sql1
将删除在存储过程中创建的本地临时表 当存储过程完成时自动执行

在您的例子中,sp_executesql是存储过程

exec sp_executesql完成后,将删除在动态查询中创建的表。这就是为什么你会犯这样的错误

您需要在外部创建表并使用Insert into table.。在动态查询中选择语法

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)'

我打赌您可以创建代码的最小版本,使问题只关注问题。我猜在标签中你是指sql server而不是服务器?这就解决了它!非常感谢。记住用绿色的勾号接受正确的答案。同样作为参考,我的意思是最小、完整和可验证:大多数SQL代码都需要并发。大多数人不是全部。此解决方案在同时出现的情况下很有可能出现中断。@ShannonSeverance在这种情况下,问题在于OP问题,而不是VDK提供的答案。因为这个答案实际上解决了问题。我不确定你的意思,因为我做了一个测试用例,我可以在sp_executesql之后访问时态表。检查这个@JuanCarlosOropeza-我在解释临时表。。不适用于全局临时表。。尝试在代码中将其更改为临时表。它将失败