问题描述
我正在尝试创建驻留在远程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。
解决方法
为什么要使用功能?
根据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'