/ / O identificador de várias partes não pode ser vinculado com a aplicação cruzada à função de servidor vinculado com OPENQUERY - sql-server, join, openquery, cross-apply

O identificador de várias partes não pode ser vinculado com a aplicação cruzada à função de servidor vinculado com OPENQUERY - sql-server, join, openquery, cross-apply

Eu estou tentando fazer uma chamada remota para uma funçãoatravés de um servidor vinculado que não é permitido diretamente ([linkedserver]. [banco de dados]. [dbo] .fnGet ()], então eu estou tendo que usar OPENQUERY para executar essa chamada de função. Isso funciona muito bem quando eu codificar em um valor como meu parâmetro de função, mas eu preciso que essa chamada de função seja dinâmica e use uma coluna de uma tabela unida (via 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

infelizmente, continua falhando dizendo que o identificador de várias partes "sc.StudentId" não pôde ser ligado.

Eu encontrei alguns recursos que mostram como corrigir isso para chamadas de função local, mas nada para uma chamada remota com OPENQUERY.

Qualquer ajuda seria muito apreciada.

Respostas:

0 para resposta № 1

Seu OPENQUERY é uma string passada para o servidor em uma sessão separada da sua sessão atual. Não sabe nada sobre o seu StudentClasses AS sc na consulta principal. Você pode reescrever com isso em mente (eu não sei o suficiente sobre seus dados para saber se isso é possível no seu caso) ou você pode mudar o seu OPENQUERY para que você passe o valor para a string.Isso será lento, mas vai funcionar.

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:

Outra coisa que você poderia tentar seria evitar o OPENQUERY todos juntos:

SELECT
sc.FirstName
,sc.LastName
,sc.StudentId
,p.EnrollId
,[LinkedServer].database.dbo.fnGet(sc.StudentId) AS EnrollId
FROM
StudentClasses AS sc