SQL Server 2012 - 在函数内部运行动态查询(或跨链接服务器执行函数)

Posted

技术标签:

【中文标题】SQL Server 2012 - 在函数内部运行动态查询(或跨链接服务器执行函数)【英文标题】:SQL Server 2012 - Running Dynamic Query Inside of Function (or exec function across linked server) 【发布时间】:2016-08-10 16:34:06 【问题描述】:

我在一个链接到我当前服务器的服务器中有一个函数。此功能也存在于本地服务器中,但是,为了维护一个精确的副本,我们必须在两个位置部署任何更改(不理想)。

是否可以: 1.跨链接服务器执行功能或 2. 执行动态sql查询,使下面的函数能正确执行?

Create Function [dbo].[Build_HH_Key] (@lastname varchar(60),@address varchar(150), @zip varchar(10))
returns varchar(30)
as
Begin

    Declare @out_var as varchar(30)
    Declare @innerSQL as varchar(1000) = 'select out_var = [MyDatabase].[dbo].[Build_HH_Key]('+@lastname+','+@address+','+@zip+')'
    Declare @sql as varchar(1000) = 'select @out_var = out_var from openquery([MyServer],'' '+ @innersql +' '' )'

    Declare @Return as varchar(30) 
    exec sp_executesql @sql, N'@out_var varchar(30) OUTPUT', @Return = @out_var output;

    Return @Return; 

End

【问题讨论】:

喜欢吗? ***.com/questions/4125820/… @scsimon - 我之前查看了这个问题并检查了这个人的链接。评论指出可能存在版本错误,因为他使用 SQL Server 2005 并获得成功,而 2008 或更高版本却出现错误。 【参考方案1】:

在函数所在的本地服务器上,您可以创建一个视图来存储函数定义,如下所示:

创建视图 myFunctionDefinition 作为

SELECT sm.object_id,   
   OBJECT_NAME(sm.object_id) AS object_name,    
   sm.definition 
FROM Server.Database.sys.sql_modules AS sm  
WHERE sm.object_id = OBJECT_ID('dbo.ufn_myTestFN')

当然,您可以引入所有功能并在下一部分中限制您想要的功能。

然后您可以在链接服务器上创建一个作业,该作业会引入该函数的定义(代码),并使用视图中的内容更改其数据库中的当前版本。

declare @fn varchar max
set @fn = select definition from Server.Database.dbo.myFunctionDefinition
set @fn = replace(@fn,'create','alter')
sp_execute @fn

【讨论】:

以上是关于SQL Server 2012 - 在函数内部运行动态查询(或跨链接服务器执行函数)的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2012内部原理及故障排除(专栏)

Blazor WebAssembly FetchData 无法在 SQL Server 上运行

SQL Server使用xp_cmdshell提示“不是内部或外部命令,也不是可运行的程序 或批处理文件”

SQL Server 2012 - 使用积压和结转运行总计

长 SQL 文件运行 SQL Server 内存不足(22,000 行)

SQL Server 中使用 Sum Aggregate 函数进行内部联接