Ответ 1
Вам нужно добавить WITH (NOLOCK)
. Не совсем понятно, почему, но я просто столкнулся с этой проблемой сегодня, и это решило мою проблему.
SELECT *
FROM [110.10.10.100].testdbname.dbo.ufn_getdata('4/25/2013') AS tb WITH (NOLOCK);
Как я могу выполнить эту работу? Я запускаю функцию с таблицей с удаленного связанного сервера. я попробовал добавить никакой блокировки к этому наименованию 4 частей, но все же я получаю ту же ошибку. Im с использованием 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 локально. Это, вероятно, будет медленным.
Также убедитесь, что для RPC OUT установлено значение TRUE в параметрах связанных серверов. Этот параметр также необходим при попытке выполнить хранимую процедуру на связанном сервере. В противном случае вы получите следующую ошибку.
Серверное имя сервера 'не настроено для RPC
Смотрите этот ответ:
Замените вызов SP запросом SELECT ... FROM fn()
, и он должен работать.
Это пример вызова удаленной пользовательской функции 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
После команда SQL OpenQuery должна работать
Значения параметров, которые окружены ', заменяются двойными ' '
Поэтому в этом случае нет необходимости создавать хранимую процедуру в базе данных целевых экземпляров
SELECT *
FROM OPENQUERY(
[110.10.10.100],
'SELECT * FROM testdbname.dbo.ufn_getdata(''4/25/2013'')'
) as oq