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

时间:2016-08-10 16:34:06

标签: sql-server sql-server-2012

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

是否可以:  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

1 个答案:

答案 0 :(得分:0)

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

创建视图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