【问题标题】:Temporary tables in Stored procedure are not accesing data?存储过程中的临时表不访问数据?
【发布时间】:2013-08-22 13:26:54
【问题描述】:

这是我的代码

create proc TEMP
    AS
    BEGIN
    DECLARE @SQL nvarchar(4000)
    IF OBJECT_ID(N'tempdb..#TEMP1') IS NOT NULL
        DROP TABLE #TEMP1;
    SET @SQL ='SELECT CUSTOMERS,AREA,HOUSEHOLDS'+CHAR(10)
    SET @SQL = @SQL +'INTO #TEMP1'+CHAR(10)
    SET @SQL = @SQL +'FROM NEW'+CHAR(10)
    PRINT(@SQL)
    EXEC (@SQL)
    IF OBJECT_ID(N'tempdb..#TEMP2') IS NOT NULL
        DROP TABLE #TEMP2;
    SET @SQL ='SELECT CUSTOMERS,AREA,VEHICELS'+CHAR(10)
    SET @SQL = @SQL +'INTO #TEMP2'+CHAR(10)
    SET @SQL = @SQL +'FROM OLD'+CHAR(10)
    PRINT(@SQL)
    EXEC (@SQL)
    IF OBJECT_ID(N'tempdb..#TEMP3') IS NOT NULL
        DROP TABLE #TEMP3;
    SET @SQL ='SELECT 0.VEHICELS,C.HOUSEHOLDS'+CHAR(10)
    SET @SQL = @SQL +'INTO #TEMP3'+CHAR(10)
    SET @SQL = @SQL +'FROM #TEMP1 C'+CHAR(10)
    SET @SQL = @SQL +'INNER JOIN #TEMP2 O '+CHAR(10)
    SET @SQL = @SQL +'on C.CUSTOMERS=O.CUSTOMERS'+CHAR(10)
    SET @SQL = @SQL +'AND C.AREA=O.AREA'+CHAR(10)
    PRINT(@SQL)
    EXEC (@SQL)
    END

我的错误:

Msg 208, Level 16, State 0, Line 1
Invalid object name '#TEMP1'.

第一个 TEMP1 和 TEMP2 运行良好,但是当涉及到 TEMP3 时,它不会访问存在数据的 TEMP1

你们能检查一下这个令人困惑的问题吗???

DECLARE @sql varchar(max)
SET @sql = 'CREATE TABLE ##T1 (Col1 varchar(20))'
EXEC(@sql)
INSERT INTO ##T1 (Col1) VALUES ('This will work.')
SELECT * FROM ##T1

如果我们使用全球临时表,我们将来会遇到任何问题吗???

【问题讨论】:

  • 我不确定您为什么将其作为动态 SQL 并使用 EXECEXEC 为执行提供的查询创建了一个新范围。当范围退出时,在该范围内创建的任何临时表都将被删除。
  • 为什么要使用动态SQL?如果您使用普通 SQL,则您的临时表在 SP 的所有执行中都是可见的,因此您可以使用 temp1 和 temp2 填充 temp3。

标签: sql tsql stored-procedures sql-server-2008-r2 temp-tables


【解决方案1】:

一旦 exec 执行完毕,#temp 表就会被删除 也许如果你尝试使用更广泛的范围,它可能会成功,我不知道。

试试这样的。

create proc TEMP
AS
BEGIN
    DECLARE @now datetime;
    DECLARE @TempTableTableSuffix sysname
    SET @now = GETDATE()

    select @TempTableTableSuffix = CONVERT(VARCHAR, CONVERT(int,RAND(DATEPART(MILLISECOND,@now)+1000*(DATEPART(SECOND,@now)+60*(DATEPART(MINUTE,@now)+60*DATEPART(HOUR,@now)))) * 100000000))

    DECLARE @SQL nvarchar(4000)
    SET @SQL ='SELECT CUSTOMERS,AREA,HOUSEHOLDS'+CHAR(10)
    SET @SQL = @SQL +'INTO ##TEMP1' + @TempTableTableSuffix + CHAR(10)
    SET @SQL = @SQL +'FROM NEW'+CHAR(10)
    PRINT(@SQL)
    EXEC (@SQL)
    SET @SQL ='SELECT CUSTOMERS,AREA,VEHICELS'+CHAR(10)
    SET @SQL = @SQL +'INTO ##TEMP2' + @TempTableTableSuffix + CHAR(10)
    SET @SQL = @SQL +'FROM OLD'+CHAR(10)
    PRINT(@SQL)
    EXEC (@SQL)
    SET @SQL ='SELECT 0.VEHICELS,C.HOUSEHOLDS'+CHAR(10)
    SET @SQL = @SQL +'INTO ##TEMP3'+CHAR(10)
    SET @SQL = @SQL +'FROM ##TEMP1' + + @TempTableTableSuffix + '  C'+CHAR(10)
    SET @SQL = @SQL +'INNER JOIN #TEMP2'+ @TempTableTableSuffix  + ' O '+CHAR(10)
    SET @SQL = @SQL +'on C.CUSTOMERS=O.CUSTOMERS'+CHAR(10)
    SET @SQL = @SQL +'AND C.AREA=O.AREA'+CHAR(10)
    PRINT(@SQL)
    EXEC (@SQL)

END

无论如何,我认为您不需要dynamic SQL

【讨论】:

  • 全局变量也不起作用..无效的对象名称'##TEMP1'。
【解决方案2】:

使用单个 EXEC -

DECLARE @SQL nvarchar(MAX)
IF OBJECT_ID(N'tempdb..#TEMP1') IS NOT NULL
    DROP TABLE #TEMP1;
IF OBJECT_ID(N'tempdb..#TEMP2') IS NOT NULL
    DROP TABLE #TEMP2;    
IF OBJECT_ID(N'tempdb..#TEMP3') IS NOT NULL
    DROP TABLE #TEMP3;        


SET @SQL = ' SELECT CUSTOMERS,AREA,HOUSEHOLDS'+CHAR(10)
SET @SQL = @SQL + ' INTO #TEMP1'+CHAR(10)
SET @SQL = @SQL + ' FROM NEW'+CHAR(10)

SET @SQL = @SQL + ' SELECT CUSTOMERS,AREA,VEHICELS'+CHAR(10)
SET @SQL = @SQL + ' INTO #TEMP2'+CHAR(10)
SET @SQL = @SQL + ' FROM OLD'+CHAR(10)
SET @SQL = @SQL + ' SELECT 0.VEHICELS,C.HOUSEHOLDS'+CHAR(10)
SET @SQL = @SQL + ' INTO #TEMP3'+CHAR(10)
SET @SQL = @SQL + ' FROM #TEMP1 C'+CHAR(10)
SET @SQL = @SQL + ' INNER JOIN #TEMP2 O '+CHAR(10)
SET @SQL = @SQL + ' on C.CUSTOMERS=O.CUSTOMERS'+CHAR(10)
SET @SQL = @SQL + ' AND C.AREA=O.AREA'+CHAR(10)
PRINT(@SQL)
EXEC (@SQL)

【讨论】:

  • 在 StackOverflow 上显示代码的正确方法是每行缩进四个空格(或者只需突出显示该块并点击{} 按钮,编辑器就会为您完成)。 <pre> 会阻止一些工作,但不要打开语法高亮。
  • 好的!我会的。谢谢!我不知道!
猜你喜欢
  • 1970-01-01
  • 2011-09-29
  • 2014-12-22
  • 1970-01-01
  • 1970-01-01
  • 2011-07-18
  • 1970-01-01
  • 2011-10-29
相关资源
最近更新 更多