【问题标题】:Can i call a stored procedure through a view in Microsoft SQL Azure (RTM) - 12.0.2000.8我可以通过 Microsoft SQL Azure (RTM) 中的视图调用存储过程吗 - 12.0.2000.8
【发布时间】:2023-04-01 01:53:01
【问题描述】:

我有一个需要从视图中调用的动态数据透视存储过程,是否可以在 Microsoft SQL Azure (RTM) - 12.0.2000.8 中调用?

CREATE PROCEDURE [dbo].[MyProc]
AS
DECLARE @pivv NVARCHAR(MAX),@Query NVARCHAR(MAX)

SELECT @pivv=COALESCE(@pivv+',','')+ QUOTENAME(DIVISION) from [dbo].[sales_table] GROUP BY DIVISION

IF ISNULL(@pivv, '')<>''
    SET @Query='SELECT * FROM(
        SELECT STOREID, DIVISION  TYP,   SALES VAL from [dbo].[sales_table] 
        )x pivot (MAX(VAL) for TYP in ('+@pivv+')) as xx'

IF ISNULL(@Query, '')<>''
EXEC (@Query)
GO

【问题讨论】:

  • 你现在尝试了什么?如果失败,错误信息是什么?
  • 试过 OpenQuery 但不支持,因为输出是动态的,无法得出结论
  • 看你的SP,看来你可以轻松避免动态查询。取而代之的是逗号分隔的字符串@pivv,您可以声明一个表变量来插入除法。然后代替动态 sql 形成,你可以只做一个 in 或加入那个 table var。然后将 SP 转换为表值 udf。最后,不要在视图中使用疯狂的 openquery,只需像另一个表一样进行简单的 udf 调用。
  • 或者更简单的查询可以在单个语句中使用 PARTITION BY Division 来完成
  • 您好,请您详细解释一下好吗?

标签: function stored-procedures view azure-sql-database dynamic-pivot


【解决方案1】:

这是答案:

当执行下面的proc时,它直接创建一个视图,这个proc可以通过弹性作业不频繁的间隔触发,也可以通过检查源表中何时添加新的划分来触发。

CREATE PROCEDURE [dbo].[MyProc]
AS
DECLARE @pivv NVARCHAR(MAX),@Query NVARCHAR(MAX)

SELECT @pivv=COALESCE(@pivv+',','')+ QUOTENAME(DIVISION) from [dbo].[sales_table] GROUP BY DIVISION

IF ISNULL(@pivv, '')<>''
    SET @Query='CREATE VIEW MY_VIEW AS SELECT * FROM(
        SELECT STOREID, DIVISION  TYP,   SALES VAL from [dbo].[sales_table] 
        )x pivot (MAX(VAL) for TYP in ('+@pivv+')) as xx'

IF ISNULL(@Query, '')<>''
EXEC (@Query)
GO

【讨论】:

    【解决方案2】:

    @Nani - 我想扩展我的同事(Kalyan 和 Krishnendu)就支持 DMV 的 Azure SQL (RTM) 12.0.2000.8 分享、提供和回答的内容。 Azure SQL 数据库(单实例)支持用户 DMV,但仅支持 System Dynamic Management Views。您的选择是在 Azure VM 上利用 Azure SQL 数据库托管实例或 SQL Server,因为这些 SQL 部署选项提供了接近本地的体验,其中 Azure SQL 数据库(单一实例)提供了部分功能。所有这三个都运行相同的 (12.0.2000.8) 版本。确定哪种 12.x 部署适用于这种情况的关键是查看 @SERVERPROPERTY (Transact-SQL) 值:

      SERVERPROPERTY('EngineEdition') AS "Engine Edition", 
      SERVERPROPERTY('Edition') AS "Edition",
    

    我在 Azure SQL 数据库(单实例)上运行了上述查询,因为它被标识为 Engine Edition = 5(SQL 数据库)。如果您对 Azure SQL 数据库托管实例(或 Azure 中的任何 SQL 数据库实例)运行相同的查询,您将看到 Product Version = 12.0.2000.8 在所有实例中都是相同的,但 Engine Edition 会不是,这就是为什么您的解决方案适用于某些 RTM 产品版本 12.0.2000.8 实例而不适用于其他实例的原因。如果它在本地 SQL Server 实例中运行,并且您希望它在 Azure 中按原样运行,则需要将 SQL Server 实例部署到 Azure VM 并且是 IaaS 选项。 Azure SQL 数据库托管实例是 PaaS 选项,但两种特定部署类型之间的 T-SQL 有一些细微差别,详情如下:T-SQL differences between SQL Server & Azure SQL Managed Instance

    总之,产品版本 @SERVERPROPERTY 本身无法确定对给定功能的支持。您还需要包含 Engine Edition @SERVERPROPERTY。有了这个,您可以针对特定的讨论点,围绕对所需功能的支持等进行。

    SELECT  SERVERPROPERTY('ProductVersion') AS "Product Version", 
        SERVERPROPERTY('ProductLevel') AS "Product Level", 
        SERVERPROPERTY('EngineEdition') AS "Engine Edition", 
        SERVERPROPERTY('Edition') AS "Edition",
        @@Version AS "Version";
    

    问候, 迈克

    【讨论】:

    • 嗨,迈克,感谢您提供的详细信息,我很乐意回答我的问题。
    猜你喜欢
    • 2012-07-17
    • 2012-05-24
    • 2020-04-03
    • 1970-01-01
    • 2018-12-16
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多