リモートリンクサーバーからテーブル値関数を実行しています。この4つの部分の命名にロックを追加しようとしませんでしたが、それでも同じエラーが発生します。 mssql-2008を使用している
select * from [110.10.10.100].testdbname.dbo.ufn_getdata('4/25/2013') as tb;(NOLOCK)
WITH (NOLOCK)
を追加する必要があります。理由は完全にはわかりませんが、今日この問題にぶつかりました。これで問題が解決しました。
SELECT *
FROM [110.10.10.100].testdbname.dbo.ufn_getdata('4/25/2013') AS tb WITH (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で作成できます。ただし、これはおそらく遅いでしょう。
次の SQL OpenQuery コマンドは機能するはずです
'で囲まれたパラメーター値は、double' 'に置き換えられます
したがって、この場合、ターゲットインスタンスデータベースにストアドプロシージャを作成する必要はありません。
SELECT *
FROM OPENQUERY(
[110.10.10.100],
'SELECT * FROM testdbname.dbo.ufn_getdata(''4/25/2013'')'
) as oq
これは、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