2017-07-14 47 views
0

如果我自己运行下面的select语句(表名是硬编码的),它运行良好,临时表被创建。如果我按照下面的方式运行它,它会显示'无效的对象名称'#TempCodes'',但是当我打印@ Sql1时,它看起来与我自己运行时完全相同(表名硬编码)。需要帮助。消息说临时表不存在:'无效的对象名'#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 
+1

我敢打赌,你可以创建你的代码的最低版本,使问题只注重问题里面Insert into table..select语法。 [**如何创建一个最小化,完整和可验证的示例**](http://stackoverflow.com/help/mcve) –

+0

我猜标签你的意思是'sql-server'而不是'server'? –

回答

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 '[email protected]+ 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 
+0

修好了!非常感谢。 – user2970010

+0

请记住使用绿色勾号接受答案正确。另外作为参考,这是我的意思是最小,完整和可验证的:http://rextester.com/OVLG5995 –

+0

大多数SQL代码需要并发。大多数不是全部。这种解决方案在并发情况下具有很高的破解潜力。 –

1

我认为##是一个错字。即使你将它修复到#它也会引发相同的错误。

EXECUTE sp_executesql @Sql1 

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

在你的情况sp_executesql是存储过程。

exec sp_executesql完成后,动态查询内部创建的表格将被删除。这就是为什么你得到这个错误。

你需要之外创建表并使用动态查询

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 '[email protected]+ N')t CROSS APPLY 
x.nodes(''/XMLRoot/RowData'')m(n)' 
+0

林不知道你的意思,因为我做了一个测试用例,我可以在'##'改变'#'后在sp_executesql后访问临时表。检查http://rextester.com/OVLG5995 –

+0

@JuanCarlosOropeza - 我正在为临时表解释..不是全局临时表..尝试将它更改为代码中的#temp表。它会失败 –