【问题标题】:Remote table-Valued Function Calls are not allowed不允许远程表值函数调用
【发布时间】:2013-04-19 00:23:16
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 这会为我生成一个错误。这似乎与dba.stackexchange.com/questions/71174/…上的答案相冲突。
    • 这对我有用。一些旧代码只有 (nolock) 并且我在 SSMS 中使用它时遇到错误。添加 WITH 解决了我的问题。
    • 这对我不起作用,或者返回错误“不允许远程表值函数调用。”你在哪个版本中工作?我试过 2012 年。
    • @HannoverFist 完全正确!我在升级时遇到了这个问题。旧查询在表后只使用(NOLOCK) 而不是WITH (NOLOCK) 执行selects;显然,旧版本的 SQL 比新版本更能容忍这种遗漏。好提示@ExceptionLimeCat!
    • 这也适用于我。使用 Azure DB 时,必须使用 WITH
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      按照SQL OpenQuery 命令应该可以工作

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

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

      SELECT * 
      FROM OPENQUERY(
          [110.10.10.100],
          'SELECT * FROM testdbname.dbo.ufn_getdata(''4/25/2013'')'
      ) as oq
      

      【讨论】:

        【解决方案4】:

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

        没有为 RPC 配置服务器“服务器名”

        【讨论】:

          【解决方案5】:

          看到这个答案:

          Use OPENQUERY

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

          【讨论】:

            【解决方案6】:

            这是在 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
            

            【讨论】:

              猜你喜欢
              • 2013-02-16
              • 2015-03-13
              • 2020-04-10
              • 2021-08-30
              • 2013-06-02
              • 2014-03-07
              • 2014-07-05
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多