Comment puis-je faire cela? Im exécutant une fonction de valeur de table à partir d'un serveur lié distant. j'ai essayé d'ajouter aucun verrou à cette dénomination en 4 parties mais j'obtiens toujours la même erreur. J'utilise MSSQL-2008
select * from [110.10.10.100].testdbname.dbo.ufn_getdata('4/25/2013') as tb;(NOLOCK)
Vous devez ajouter WITH (NOLOCK)
. Je ne sais pas vraiment pourquoi, mais je suis tombé sur ce problème aujourd'hui et cela a résolu mon problème.
SELECT *
FROM [110.10.10.100].testdbname.dbo.ufn_getdata('4/25/2013') AS tb WITH (NOLOCK);
Nolock ne fonctionne pas pour moi.
Cependant, l'utilisation d'OPENQUERY ne ...
Remplacez DMS_DB.dbo.tfu_V_DMS_Desktop(''de'')'
par [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
Dans une note de bas de page, le problème est que OPENQUERY n'autorise pas une variable, vous ne pouvez donc pas avoir de paramètres de variable. Vous pouvez cependant référencer toutes les tables et vues en tant que vues à partir d'un serveur distant et créer simplement la fonction table 1: 1 localement. Cependant, cela sera probablement lent.
La commande SQL OpenQuery devrait fonctionner
Les valeurs de paramètres entourées de ' sont remplacées par des doubles ' '
Dans ce cas, il n'est donc pas nécessaire de créer une procédure stockée sur la base de données d'instance cible
SELECT *
FROM OPENQUERY(
[110.10.10.100],
'SELECT * FROM testdbname.dbo.ufn_getdata(''4/25/2013'')'
) as oq
Voir cette réponse:
Remplacez SP call par SELECT ... FROM fn()
query et cela devrait fonctionner.
C'est l'exemple de l'appel d'une fonction définie par l'utilisateur SQL distant renvoyant une table en sortie dans SQL Server 2014. Cela fonctionne pour moi.
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