Les appels de fonctions à valeur de table à distance ne sont pas autorisés
Comment faire pour que ça marche?J'exécute une fonction de valeur de table à partir d'un serveur lié à distance. j'ai essayé d'ajouter AUCUNE serrure à ce nom de 4 parties mais j'obtiens toujours la même erreur. Im en utilisant mssql-2008
select * from [110.10.10.100].testdbname.dbo.ufn_getdata('4/25/2013') as tb;(NOLOCK)
6 réponses
Vous devez ajouter WITH (NOLOCK)
. Je ne sais pas vraiment pourquoi, mais je viens de rencontrer 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 de OPENQUERY le fait...
Remplacer 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
sur une note de bas de page, le problème est que OPENQUERY n'autorise pas une variable, donc vous ne pouvez pas avoir de paramètres variables. Vous pouvez cependant référencer toutes les tables et vues comme vues à partir d'un serveur distant, et juste créer la fonction de valeur de table 1:1 localement. Ce sera probablement lente, cependant.
assurez-vous également que RPC OUT est défini à TRUE dans les options du serveur lié. Cette option est également nécessaire lorsque vous essayez d'exécuter une procédure stockée sur un serveur lié. Sinon, vous obtiendrez l'erreur suivante.
Server 'servername' n'est pas configuré pour RPC
Suivant SQL OpenQuery commande devrait fonctionner
valeurs des paramètres qui sont entourées de ' sont remplacés par double "
donc dans ce cas il n'est 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:
remplacer SP call par SELECT ... FROM fn()
requête et ça devrait marcher.
ceci est l'exemple de l'appel d'une fonction définie par un utilisateur SQL distant retournant une table en sortie dans SQL Server 2014. Il est travaillé 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