sql - 在 SQL Azure 中使用临时表

标签 sql sql-server azure-sql-database

我正在编写一个查询来旋转表元素,其中列名称是动态生成的。

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 中不起作用,因为那里不允许使用全局临时表。

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

Invalid object name '#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

关键是在外部作用域中创建临时表,然后内部作用域(在 EXEC 语句内运行的代码)可以访问相同的临时表。上面的代码适用于 SQL Server 2008,但我没有可以使用的 Azure 实例,因此没有在那里进行测试。

关于sql - 在 SQL Azure 中使用临时表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7021483/

相关文章:

sql - 实体关系图 - 3个没有链接的表

sql - 在 Azure 逻辑应用条件中访问 Azure SQL 存储过程

c# - 从 Windows 命令提示符运行本地 SQL 脚本文件以更新远程 SQL Server 数据库

sql-server - SQL Server 等效于 Postgres 查询

azure - 直接连接到 SQL Azure 与通过 API 服务层连接?

sql-server - 我们可以在 Azure 上的 T-SQL 过程中创建数据库范围的凭据吗

azure - 我想使用适用于我的 Xamarin 应用程序的 xamarin Azure SDK 备份和还原 SQLite 数据库文件

sql - 极度减小尺寸后小表性能低下

MYSQL 查询帮助- Substring 和 Instring

sql - 游标/递归是这里唯一可能的选择吗?根据一定的滞后条件设置逻辑