【问题标题】:SQL Server 2008 - #tmp table throws error when run within an exec command [duplicate]SQL Server 2008 - #tmp 表在 exec 命令中运行时抛出错误 [重复]
【发布时间】:2012-10-29 17:21:39
【问题描述】:

可能重复:
TSQL Writing into a Temporary Table from Dynamic SQL

 ALTER PROCEDURE [dbo].[usp_ServicesStats1](@PERIOD VARCHAR(30) )

 AS
 BEGIN
-- SET NOCOUNT ON added to prevent extra result SETs FROM
-- interfering with SELECT statements.
SET NOCOUNT ON;


 DELETE FROM servicesstats1;
 DECLARE @QUERY  NVARCHAR(MAX);

 DECLARE @mainTable VARCHAR(50)

 SET @mainTable = '[ServicesStats' + @PERIOD + ']';



 SET @QUERY = 'INSERT INTO servicesstats1(Department,StudentUsers) 
 SELECT department,COUNT(*) FROM ' +  @mainTable + 
 'GROUP BY department';

 EXEC(@QUERY); -- runs okay!


 IF OBJECT_ID('tempdb..[##tmp5]') is not null 
BEGIN 
    drop table [##tmp5] 
END

 SET @QUERY = ' SELECT studentid
 INTO [##tmp5]
 FROM ' + @mainTable + '
 GROUP BY studentid
 having COUNT(*)=1; select * from [##tmp5];';
 PRINT @QUERY;


 EXEC sp_executesql @QUERY;

 IF OBJECT_ID('tempdb..[#tmp3]') is not null 
BEGIN 
    drop table [#tmp3] 
END

 SELECT S.department,COUNT(*) AS No INTO #TMP3 --  ONLY THIS SERVICE 
 FROM servicesstats_0511_0412 s, #TMP5 T    -- this is not being replaced yet by the @mainTable
 WHERE S.STUDENTID = T.STUDENTID
 GROUP BY S.department

错误:

无效的对象名称“#TMP5”。

问题是临时表#tmp5,现在如果我要运行它,它会工作,但它不是动态的。

SELECT studentid
INTO [#tmp5]
FROM tableName
GROUP BY studentid
having COUNT(*)=1;

基本上我这样做是因为动态表名。但是#tmp 抛出了这个错误。

【问题讨论】:

    标签: sql sql-server tsql temp-tables


    【解决方案1】:

    您使用的是本地临时表,它只存在于您的动态sql范围内,因此您可以如下引用它而不会出错:

    SET @QUERY = ' SELECT studentid
    INTO [#tmp5]
    FROM ' + @mainTable + '
    GROUP BY studentid
    having COUNT(*)=1; 
    SELECT * 
    FROM [#tmp]';
    
    EXEC sp_executesql @QUERY;
    

    但是,当您尝试在动态 sql 范围之外访问它时,您将无法再从 SSMS 中的另一个窗口访问它。您需要使用全局临时表,然后才能访问它:

    SET @QUERY = ' SELECT studentid
    INTO [##tmp5]
    FROM ' + @mainTable + '
    GROUP BY studentid
    having COUNT(*)=1;';
    
    EXEC sp_executesql @QUERY;
    
    SELECT  *
    FROM    [##Tmp5];
    

    请注意多用户环境中可能出现的问题。

    【讨论】:

    • 您好,Gareth,感谢您的意见。但是,当我尝试它时(它是存储过程的一部分),即使我添加了一个额外的 # 符号,它仍然会引发相同的错误。
    • 该错误几乎肯定不是来自您将数据插入表中时,而是来自稍后在您引用表的过程中。你能发布更多你的程序吗?
    • 当然可以。但是,错误会在 exec 之后的下一行引发。
    • 我真的看不出错误发生在哪里。 This SQL Fiddle 表明在动态 SQL 中创建临时表并稍后引用它应该没有问题。让我想想……
    • 我用双哈希替换我的代码中的所有内容会让你知道 :)
    猜你喜欢
    • 2015-10-09
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2017-04-16
    • 2019-07-01
    • 2015-11-05
    • 1970-01-01
    • 2012-08-10
    相关资源
    最近更新 更多