/ / El identificador de varias partes no se puede vincular con la aplicación cruzada a la función del servidor vinculado con OPENQUERY - servidor SQL, unirse, abrir consulta, aplicar de forma cruzada

El identificador de varias partes no se puede vincular con la aplicación cruzada a la función del servidor vinculado con OPENQUERY - servidor sql, join, openquery, cross-apply

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

Su 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