web-dev-qa-db-fra.com

Les appels de fonction à valeur table distante ne sont pas autorisés

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)
29
anonymous1110

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);
52
ExceptionLimeCat

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.

10
Stefan Steiger

Assurez-vous également que RPC OUT est défini sur TRUE dans les options de serveur lié. Cette option était également nécessaire lorsque vous essayez d'exécuter une procédure stockée sur un serveur lié. Sinon, vous obtiendrez l'erreur suivante.

Le serveur 'nom_serveur' n'est pas configuré pour RPC

enter image description here

4
Shahdat

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
3
Eralper

Voir cette réponse:

tilisez OPENQUERY

Remplacez SP call par SELECT ... FROM fn() query et cela devrait fonctionner.

1
Mr. TA

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
1
Rajesh