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 - 在函数内部运行动态查询(或跨链接服务器执行函数)的主要内容,如果未能解决你的问题,请参考以下文章
Blazor WebAssembly FetchData 无法在 SQL Server 上运行
SQL Server使用xp_cmdshell提示“不是内部或外部命令,也不是可运行的程序 或批处理文件”