2013-04-25 22 views
23

Làm thế nào tôi có thể thực hiện công việc này? Im chạy một hàm có giá trị bảng từ một máy chủ được liên kết từ xa. tôi đã cố gắng thêm không có khóa để đặt tên 4 phần này nhưng tôi vẫn nhận được lỗi tương tự. Im sử dụng mssql-2008Từ xa chức năng bảng giá trị Cuộc gọi không được phép

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

Trả lời

40

Bạn cần thêm WITH (NOLOCK). Không hoàn toàn chắc chắn lý do tại sao nhưng tôi chỉ chạy vào vấn đề này ngày hôm nay và điều này giải quyết vấn đề của tôi.

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

WITH từ khóa thực sự là lừa. –

+1

Điều này tạo ra lỗi cho tôi. Dường như xung đột với câu trả lời trên http://dba.stackexchange.com/questions/71174/use-nolock-hint-when-calling-table-valued-function. –

+2

Điều này làm việc cho tôi. Một số mã cũ chỉ có ** (nolock) ** và tôi đã nhận được một lỗi bằng cách sử dụng nó trong SSMS. Thêm ** WITH ** đã khắc phục sự cố của tôi. –

2

Xem câu trả lời này:

Use OPENQUERY

Thay thế gọi SP với SELECT ... FROM fn() truy vấn và nó sẽ làm việc.

9

Nolock không hoạt động đối với tôi.
Tuy nhiên, sử dụng OPENQUERY làm ...

Thay DMS_DB.dbo.tfu_V_DMS_Desktop(''de'')' với [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 

Trên một chú thích, vấn đề là OPENQUERY không cho phép một biến, vì vậy bạn không thể có tham số biến. Tuy nhiên, bạn có thể tham chiếu tất cả các bảng và dạng xem dưới dạng lượt xem từ một máy chủ từ xa và chỉ cần tạo hàm có giá trị 1: 1 trong bảng. Tuy nhiên, điều này có thể sẽ chậm.

+0

OPENQUERY hoạt động giống như ma thuật. – christofr

+3

Lưu ý: Thay vào đó, các bảng tham chiếu và chế độ xem dưới dạng "Từ đồng nghĩa" - biến thể tốt hơn nhiều ... –

3

Cũng đảm bảo rằng RPC OUT được đặt thành TRUE trong tùy chọn máy chủ được liên kết. Tùy chọn này cũng cần thiết khi bạn cố gắng thực hiện thủ tục lưu sẵn trên máy chủ được liên kết. Nếu không, bạn sẽ nhận được lỗi sau.

Server 'servername' không được cấu hình cho RPC

enter image description here

1

Đây là ví dụ về cách gọi một người sử dụng SQL từ xa định nghĩa hàm trả về một bảng như đầu ra trong SQL Server 2014. Nó là làm việc cho tôi.

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

Sau đây SQL OpenQuery lệnh nên được làm việc

giá trị thông số được bao quanh với ' được thay thế bằng đôi ''

Vì vậy, trong trường hợp này không có nhu cầu để tạo ra một lưu trữ thủ tục trên cơ sở dữ liệu cá thể đích

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