2017-07-14 73 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表。它會失敗 –