【问题标题】:Alternatives to global temp table in Sql azureSql azure 中全局临时表的替代方案
【发布时间】:2011-07-29 09:37:38
【问题描述】:

我的 sp 的一部分包含以下代码。代码在我的本地 sql 数据库中成功执行。但是当我在 sql azure 中运行它时,它会给出错误消息:

“此版本的 SQL Server 不支持全局临时对象。”

如何更改此查询以使其在 azure 中运行。

    SET @query = N'SELECT STUDENT_ID, ROLL_NO, TITLE, STUDENT_NAME, EXAM_NAME, '+
                @cols +
                ' INTO ##FINAL 
                FROM
                (
                    SELECT ROLL_NO, TITLE, STUDENT_ID, SUBJECT_ID, STUDENT_NAME, EXAM_NAME, DISPLAYORDER, MARKS
                    FROM #AVERAGES
                    UNION 
                    SELECT ROLL_NO, TITLE, STUDENT_ID, SUBJECT_ID, STUDENT_NAME, EXAM_NAME, DISPLAYORDER, MARKS
                    FROM #MARKS 
                    UNION
                    SELECT ROLL_NO, TITLE, STUDENT_ID, SUBJECT_ID, STUDENT_NAME, EXAM_NAME, DISPLAYORDER, MARKS
                    FROM #GRACEMARKS
                    UNION
                    SELECT ROLL_NO, TITLE, STUDENT_ID, SUBJECT_ID, STUDENT_NAME, EXAM_NAME, DISPLAYORDER, MARKS
                    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)

【问题讨论】:

  • 您能解释一下为什么需要全局临时表吗?这可能有助于缩小建议解决方案的重点。
  • 我在 "@cols" 中获取列名,列名是 [10],[11],[36] 等,我不知道。我只能从“@cols”得到 dem。有什么方法可以写一个直接的查询。?

标签: sql sql-server sql-server-2008 tsql azure-sql-database


【解决方案1】:

迟到总比没有好。 Database Scoped Global Temporary Tables in public preview for Azure SQL DB:

类似于 SQL Server 的全局临时表,以##table_name 为前缀的表,Azure SQL DB 的全局临时表存储在 tempdb 中并遵循相同的语义。 但是,它们不是在服务器上的所有数据库之间共享,而是在特定数据库的范围内共享,并在同一数据库内的所有用户会话之间共享。来自其他 Azure SQL 数据库的用户会话无法访问全局作为连接到给定数据库的运行会话的一部分而创建的临时表。任何用户都可以创建全局临时对象。

CREATE TABLE ##test ( a int, b int);
INSERT INTO ##test values (1,1);

来自 MSDN CREATE TABLE:

数据库范围的全局临时表(Azure SQL 数据库)

SQL Server 的全局临时表(以## 表名启动)存储在 tempdb 中,并在整个 SQL Server 实例中的所有用户会话之间共享。有关 SQL 表类型的信息,请参阅上面有关创建表的部分。

Azure SQL 数据库支持也存储在 tempdb 中并限定为数据库级别的全局临时表。这意味着全局临时表是为同一 Azure SQL 数据库中的所有用户会话共享的。来自其他 Azure SQL 数据库的用户会话无法访问全局临时表。

Azure SQL DB 的全局临时表遵循 SQL Server 用于临时表的相同语法和语义。同样,全局临时存储过程的范围也仅限于 Azure SQL DB 中的数据库级别。 Azure SQL 数据库也支持本地临时表(以 # 表名开头),并遵循 SQL Server 使用的相同语法和语义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    相关资源
    最近更新 更多