【问题标题】:How to create a view where data resides in a view on remote Azure SQL Server如何在远程 Azure SQL Server 的视图中创建数据所在的视图
【发布时间】:2020-10-03 10:16:52
【问题描述】:

我正在尝试创建驻留在远程 Azure SQL Server 中的数据视图。我似乎无法在视图中创建一个表或临时表来存储 sp_exeucte_remote 调用的结果,因为这是不允许的,所以我尝试使用一个函数,但随后我收到一个错误,抱怨以下错误基于提供函数定义。

Invalid use of a side-effecting operator 'INSERT EXEC' within a function

CREATE OR ALTER FUNCTION [dbo].[fn_Test]()
RETURNS @Results TABLE
(
    [ID] INT,
    [$ShardName] VARCHAR(500)
)
AS
BEGIN
    INSERT INTO @Results
    EXEC sp_execute_remote N'MyExternalDatasource', N'SELECT 1' 
    RETURN;
END

如何创建一个存在于远程 Azure SQL Server 上的数据视图,该数据也作为视图存在?仅供参考 - 我尝试创建视图的服务器也是 Azure SQL Server。

【问题讨论】:

    标签: azure-sql-database external-data-source


    【解决方案1】:

    你为什么使用函数?

    根据Microsoft Documentation,您不能在函数中调用存储过程。

    此外,您的远程执行仅返回 1 列,并且您尚未定义要插入的目标列。

    远程对象是 VIEW 的事实并不重要。如果我们假设远程数据库上的 VIEW 也有名为 ID 和 [$shardname] 的列,那么为什么不直接使用类似的东西:

    CREATE TABLE #results ([ID] int, [$shardname] varchar(500))
    INSERT #results ([ID], [$shardname])
    EXEC sp_execute_remote N'ExternalSource', N'SELECT [ID], [$shardname] FROM RemoteTableName'
    

    【讨论】:

    • 我开始使用该函数是因为我无法在视图中创建从存储过程返回结果所必需的临时变量或表变量。因此,我尝试了该函数,知道我至少可以创建变量和东西,但随后遇到了您提到的存储过程点。这就是我举手并将其张贴在堆栈中的地方。我试图使示例变得简单,但可能会使它更加混乱。我试图寻求帮助的真正问题是如何访问远程 Azure SQL Server 上的视图?
    • 我刚刚意识到...我可以在视图上创建一个外部表。应该尝试过。
    • 此外,存储过程可以在没有视图的情况下返回结果 - 它只是存储过程中的最终 SELECT 语句。 INSERT INTO ... EXEC proc 是一个有效的构造
    猜你喜欢
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    • 2011-12-09
    • 1970-01-01
    相关资源
    最近更新 更多