远程表 - 值函数不允许调用

时间:2013-04-25 07:48:18

标签: sql sql-server user-defined-functions nolock

如何使这项工作?我从远程链接服务器运行一个表值函数。我尝试添加没有锁定这4部分命名,但我仍然得到相同的错误。我正在使用mssql-2008

select * from [110.10.10.100].testdbname.dbo.ufn_getdata('4/25/2013') as tb;(NOLOCK)

6 个答案:

答案 0 :(得分:52)

您需要添加WITH (NOLOCK)。不完全确定原因,但我今天刚遇到这个问题,这解决了我的问题。

SELECT * 
FROM [110.10.10.100].testdbname.dbo.ufn_getdata('4/25/2013') AS tb WITH (NOLOCK);

答案 1 :(得分:10)

Nolock对我不起作用。
但是,使用OPENQUERY确实......

DMS_DB.dbo.tfu_V_DMS_Desktop(''de'')'替换为[110.10.10.100].testdbname.dbo.ufn_getdata(''4/25/2013'')

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tfu_V_DMS_Desktop]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [dbo].[tfu_V_DMS_Desktop]
GO



CREATE FUNCTION [dbo].[tfu_V_DMS_Desktop] 
(   
    @param1 int 
)
    RETURNS table 
AS
RETURN 
(
    -- Add the SELECT statement with parameter references here
    -- SELECT 0 as abc
    SELECT * FROM OPENQUERY(CORDB2008R2, 'SELECT * FROM DMS_DB.dbo.tfu_V_DMS_Desktop(''de'')') 
)

GO

在脚注中,问题是OPENQUERY不允许变量,因此您不能拥有变量参数。 但是,您可以将所有表和视图作为远程服务器的视图引用,并在本地创建表值函数1:1。然而,这可能会很慢。

答案 2 :(得分:4)

还要确保在链接服务器选项中将RPC OUT设置为TRUE。当您尝试在链接服务器上执行存储过程时,也需要此选项。否则您将收到以下错误。

  

没有为RPC

配置服务器'servername'

enter image description here

答案 3 :(得分:3)

以下SQL OpenQuery命令应该正常工作

' 包围的参数值将替换为双''

因此,在这种情况下,无需在目标实例数据库

上创建存储过程
SELECT * 
FROM OPENQUERY(
    [110.10.10.100],
    'SELECT * FROM testdbname.dbo.ufn_getdata(''4/25/2013'')'
) as oq

答案 4 :(得分:1)

看到这个答案:

Use OPENQUERY

将SP调用替换为SELECT ... FROM fn()查询,它应该有效。

答案 5 :(得分:1)

这是调用远程SQL用户定义函数的示例,该函数在SQL Server 2014中将表作为输出返回。它对我有用。

Declare @Param1 Varchar(10)
Declare @SqlText nvarchar(4000)
Set  @Param1 = 'xxx'
Set @SqlText = 'SELECT * FROM Database.dbo.ufn_Function (''' + @Param1 + ''')'
EXEC LinkedServer.Database.dbo.sp_executesql @SqlText