2013-04-25 44 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關鍵字的確有竅門。 – 2014-03-14 17:02:47

+1

這會爲我生成一個錯誤。這似乎與http://dba.stackexchange.com/questions/71174/use-nolock-hint-when-calling-table-valued-function上的答案相沖突。 – 2014-07-21 19:41:33

+2

這對我有用。一些舊的代碼只有**(nolock)**,並且在SSMS中使用它時出現錯誤。 **添加**修復了我的問題。 – 2015-11-18 22:01:05

2

看到這個答案:

Use OPENQUERY

替換SP的呼叫與SELECT ... FROM fn()查詢,它應該工作。

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 2015-01-29 11:41:44

+3

注意:引用表格和視圖作爲「同義詞」,而不是 - 更好的變體... – 2016-02-24 13:29:31

3

還要確保在鏈接服務器選項中將RPC OUT設置爲TRUE。當您嘗試在鏈接服務器上執行存儲過程時,也需要此選項。否則,你會得到以下錯誤。

服務器ServerName不配置爲RPC

enter image description here

1

這是調用遠程SQL用戶定義的函數在SQL Server 2014返回一個表作爲輸出它的例子爲我工作。

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