Estoy tratando de hacer una llamada remota a una funciónsobre un servidor vinculado que no está permitido directamente ([linkedserver]. [database]. [dbo] .fnGet ()], así que tengo que usar OPENQUERY para realizar esa llamada de función. Esto funciona muy bien cuando formulo un código como mi parámetro de función, pero necesito que esta llamada de función sea dinámica y use una columna de una tabla unida (a través de CROSS APPLY).
SELECT
sc.FirstName
,sc.LastName
,sc.StudentId
,p.EnrollId
FROM
StudentClasses AS sc
CROSS APPLY
(
SELECT * FROM OPENQUERY
(
[LinkedServer],"SELECT database.dbo.fnGet(sc.StudentId) AS EnrollId"
)
)AS p
desafortunadamente, sigue fallando y dice que el identificador de varias partes "sc.StudentId" no se pudo enlazar.
He encontrado algunos recursos que muestran cómo corregir esto para las llamadas a funciones locales, pero nada para una llamada remota con OPENQUERY.
Cualquier ayuda sería muy apreciada.
Respuestas
0 para la respuesta № 1Su OPENQUERY es una cadena que se pasa al servidor en una sesión separada de su sesión actual. No sabe nada de tu StudentClasses AS sc
en la consulta principal. Puede volver a escribir con eso en mente (no sé lo suficiente sobre sus datos para saber si eso es posible en su caso) o puede cambiar su OPENQUERY para que pase el valor a la cadena. Esto será lento, pero trabajará.
SELECT
sc.FirstName
,sc.LastName
,sc.StudentId
,p.EnrollId
FROM
StudentClasses AS sc
CROSS APPLY
(
SELECT * FROM OPENQUERY
(
[LinkedServer],"SELECT database.dbo.fnGet(" + Convert(varchar(11),sc.StudentId) + ") AS EnrollId"
)
)AS p
EDITAR:
Otra cosa que podrías intentar sería evitar el OPENQUERY
todos juntos:
SELECT
sc.FirstName
,sc.LastName
,sc.StudentId
,p.EnrollId
,[LinkedServer].database.dbo.fnGet(sc.StudentId) AS EnrollId
FROM
StudentClasses AS sc