繁体   English   中英

在 SQL Azure 中使用临时表

[英]using temp tables in SQL Azure

我正在编写对动态生成列名的透视表元素的查询。

SET @query = N'SELECT STUDENT_ID, ROLL_NO, TITLE, STUDENT_NAME, EXAM_NAME, '+
            @cols +
            ' INTO ##FINAL 
            FROM
            (
                SELECT  *
                FROM #AVERAGES
                UNION 
                SELECT  *
                FROM #MARKS 
                UNION
                SELECT  *
                FROM #GRACEMARKS
                UNION
                SELECT  *
                FROM #TOTAL
                ) p
                PIVOT
                (
                MAX([MARKS])
                FOR SUBJECT_ID IN
                ( '+
                @cols +' )
            ) AS FINAL
            ORDER BY STUDENT_ID ASC, DISPLAYORDER ASC, EXAM_NAME ASC;'

EXECUTE(@query) 

select * from ##FINAL 

此查询在我的本地数据库中正常工作,但在 SQL Azure 中不起作用,因为那里不允许使用全局临时表。

现在,如果我在本地数据库中将##FINA L 更改为#FINAL ,但它给了我错误

object 名称“#FINAL”无效。

我该如何解决这个问题?

好吧,说了我不认为可以做到之后,我可能有办法。 虽然很丑。 希望您可以使用以下示例并使其适应您的查询(没有您的架构和数据,我尝试编写它太棘手了):

declare @cols varchar(max)
set @cols = 'object_id,schema_id,parent_object_id'

--Create a temp table with the known columns
create table #Boris (
    ID int IDENTITY(1,1) not null
)
--Alter the temp table to add the varying columns. Thankfully, they're all ints.
--for unknown types, varchar(max) may be more appropriate, and will hopefully convert
declare @tempcols varchar(max)
set @tempcols = @cols
while LEN(@tempcols) > 0
begin
    declare @col varchar(max)
    set @col = CASE WHEN CHARINDEX(',',@tempcols) > 0 THEN SUBSTRING(@tempcols,1,CHARINDEX(',',@tempcols)-1) ELSE @tempcols END
    set @tempcols = CASE WHEN LEN(@col) = LEN(@tempcols) THEN '' ELSE SUBSTRING(@tempcols,LEN(@col)+2,10000000) END
    declare @sql1 varchar(max)
    set @sql1 = 'alter table #Boris add [' + @col + '] int null'
    exec (@sql1)
end

declare @sql varchar(max)
set @sql = 'insert into #Boris (' + @cols + ') select ' + @cols + ' from sys.objects'
exec (@sql)

select * from #Boris

drop table #Boris

他们的关键是在外部 scope 中创建临时表,然后内部范围(在EXEC语句中运行的代码)可以访问同一个临时表。 以上在 SQL Server 2008 上工作,但我没有 Azure 实例可以使用,所以没有在那里测试。

如果您创建一个临时表,它在您的 spid 中执行的动态 sql 中是可见的,如果您在动态 sql 中创建该表,则它在此之外不可见。

有一种解决方法。 您可以创建一个存根表并在动态 sql 中更改它。 它需要一些字符串操作,但我已经使用这种技术为 tsqlunit 生成动态数据集。

CREATE TABLE #t1 
(
    DummyCol int
)

EXEC(N'ALTER TABLE #t1 ADD  foo INT')

EXEC ('insert into #t1(DummyCol, foo)
VALUES(1,2)')

EXEC ('ALTER TABLE #t1 DROP COLUMN DummyCol')

select *from #t1 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM