35

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

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

6 回答 6

69

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

SELECT * 
FROM [110.10.10.100].testdbname.dbo.ufn_getdata('4/25/2013') AS tb WITH (NOLOCK);
于 2013-06-21T19:11:01.107 回答
11

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。但是,这可能会很慢。

于 2014-10-03T08:51:40.277 回答
5

以下SQL OpenQuery命令应该可以工作

用'包围的参数值被替换为双''

所以在这种情况下,不需要在目标实例数据库上创建存储过程

SELECT * 
FROM OPENQUERY(
    [110.10.10.100],
    'SELECT * FROM testdbname.dbo.ufn_getdata(''4/25/2013'')'
) as oq
于 2017-12-20T12:08:36.563 回答
4

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

未为 RPC 配置服务器“servername”

在此处输入图像描述

于 2016-12-08T16:30:47.353 回答
2

看到这个答案:

使用 OPENQUERY

用查询替换 SP 调用,SELECT ... FROM fn()它应该可以工作。

于 2013-08-23T17:44:41.983 回答
2

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

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
于 2017-04-25T21:45:21.143 回答