web-dev-qa-db-ja.com

リモートテーブル値関数呼び出しは許可されていません

リモートリンクサーバーからテーブル値関数を実行しています。この4つの部分の命名にロックを追加しようとしませんでしたが、それでも同じエラーが発生します。 mssql-2008を使用している

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

WITH (NOLOCK)を追加する必要があります。理由は完全にはわかりませんが、今日この問題にぶつかりました。これで問題が解決しました。

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

ノーロックは私には機能しません。
ただし、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で作成できます。ただし、これはおそらく遅いでしょう。

10
Stefan Steiger

また、リンクサーバーオプションでRPC OUTがTRUEに設定されていることを確認してください。このオプションは、リンクサーバーでストアドプロシージャを実行するときにも必要でした。そうしないと、次のエラーが発生します。

サーバー 'servername'はRPC用に構成されていません

enter image description here

4
Shahdat

次の SQL OpenQuery コマンドは機能するはずです

'で囲まれたパラメーター値は、double' 'に置き換えられます

したがって、この場合、ターゲットインスタンスデータベースにストアドプロシージャを作成する必要はありません。

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

この回答を参照してください:

OPENQUERYを使用

SP呼び出しをSELECT ... FROM fn()クエリで置き換えれば、動作するはずです。

1
Mr. TA

これは、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
1
Rajesh