需要帮忙。消息说临时 table 不存在:'Invalid object name '#TempCodes'。
Need help. Message says temp table doesn't exist: 'Invalid object name '#TempCodes'.'
如果我 运行 下面的 select 语句本身(带有硬编码的 table 名称)它 运行 很好,临时 table 被建造。如果我 运行 它如下所示,它说 'Invalid object name '#TempCodes'' 尽管当我打印 @Sql1 时它看起来与我 运行 它本身时完全一样(使用 table 硬编码的名字)。
任何关于这里发生的事情的想法都将不胜感激。
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
尝试使用全局临时文件 table ##TempCodes
作为本地临时文件 table 仅在当前会话中可见。
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
A local temporary table created in a stored procedure is dropped
automatically when the stored procedure is finished.
在您的例子中,sp_executesql
是存储过程。
动态查询中创建的table将在exec sp_executesql
完成后被删除。这就是您收到该错误的原因。
您需要在外部创建 table 并在动态查询中使用 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)'
如果我 运行 下面的 select 语句本身(带有硬编码的 table 名称)它 运行 很好,临时 table 被建造。如果我 运行 它如下所示,它说 'Invalid object name '#TempCodes'' 尽管当我打印 @Sql1 时它看起来与我 运行 它本身时完全一样(使用 table 硬编码的名字)。
任何关于这里发生的事情的想法都将不胜感激。
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
尝试使用全局临时文件 table ##TempCodes
作为本地临时文件 table 仅在当前会话中可见。
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
A local temporary table created in a stored procedure is dropped automatically when the stored procedure is finished.
在您的例子中,sp_executesql
是存储过程。
动态查询中创建的table将在exec sp_executesql
完成后被删除。这就是您收到该错误的原因。
您需要在外部创建 table 并在动态查询中使用 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)'