2013-04-25 51 views
23

どうすればこの問題を解決できますか?リモートリンクサーバーからテーブル値関数を実行しています。私はこの4つの部分の名前付けにロックを追加しようとしたが、それでも私は同じエラーが発生します。イム使用してMSSQL-2008リモートのテーブル値関数呼び出しは許可されていません

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

答えて

40

あなたがWITH (NOLOCK)を追加する必要があります。なぜ、私は今日この問題に遭遇したのですか?これで私の問題は解決しました。

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

WITHキーワードは確かにそのトリックです。 –

+1

これは私のためにエラーを生成します。 http://dba.stackexchange.com/questions/71174/use-nolock-hint-when-calling-table-valued-functionの回答と矛盾するようです。 –

+2

これは私のために働いた。いくつかの古いコードは**(nolock)**しか持っていなかったので、SSMSでエラーを受け取っていました。 ** WITH **を追加すると問題が解決しました。 –

2

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

Use OPENQUERY

SELECT ... FROM fn()クエリとSPの呼び出しを交換し、それが動作するはずです。

9

Nolockは私にとっては機能しません。
はしかし、OPENQUERYは...

[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 

DMS_DB.dbo.tfu_V_DMS_Desktop(''de'')'を交換しない使用して、問題がOPENQUERYは、変数を許可していませんので、あなたは、可変パラメータを持つことができません。 ただし、すべてのテーブルとビューをリモートサーバーからビューとして参照し、テーブル値関数1:1をローカルに作成することはできます。しかしこれはおそらく遅いでしょう。

+0

OPENQUERYは魔法のように機能します。 – christofr

+3

注:参照表とビューを代わりに「シノニム」と呼んでください。 –

3

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

Serverのサーバー名は、「これはこれは、SQL Serverの2014に出力としてテーブルを返すリモートSQLユーザー定義関数を呼び出す例がある

enter image description here

1

RPC用に設定されていません私のために働く。

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

SQL OpenQueryコマンドに続いてで囲まれている

パラメータ値 "が二重に置き換えられている『』

を作業する必要があるので、この場合に保存されているを作成する必要はありませんターゲットインスタンスデータベースのプロシージャ

SELECT * 
FROM OPENQUERY(
    [110.10.10.100], 
    'SELECT * FROM testdbname.dbo.ufn_getdata(''4/25/2013'')' 
) as oq 
関連する問題