/ / Identifikátor viacerých častí nemôže byť viazaný s krížovou aplikáciou na funkciu prepojeného servera s OPENQUERY - sql-server, join, openquery, cross-apply

Identifikátor viacerých častí nemôže byť viazaný s krížovou aplikáciou na funkciu prepojeného servera s OPENQUERY - sql-server, join, openquery, cross-apply

Snažím sa uskutočniť vzdialený hovor na funkciucez prepojený server, ktorý nie je povolený priamo ([linkedserver]. [databáza]. [dbo] .fnGet ()], takže musím používať OPENQUERY na vykonanie volania funkcie.To funguje skvele, keď som pevný kód v hodnote ako môj funkčný parameter, ale potrebujem, aby táto funkcia bola dynamická a použila stĺpec z pripojenej (cez CROSS APPLY) tabuľku.

    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

bohužiaľ neustále tvrdí, že viacdielny identifikátor "sc.StudentId" sa nedá viazať.

Našiel som niekoľko zdrojov, ktoré ukazujú, ako to napraviť pre miestne funkcie, ale nič pre vzdialený hovor s OPENQUERY.

Akákoľvek pomoc by bola veľmi ocenená.

odpovede:

0 pre odpoveď č. 1

Vaša OPENQUERY je reťazec prenesený na server v samostatnej relácii z vašej aktuálnej relácie. Nevie nič o vašom StudentClasses AS sc v hlavnom dopyte. Môžete buď prepísať s tým na mysli (neviem dostatočne o vašich údajoch, aby som vedel, či je to možné vo vašom prípade), alebo môžete zmeniť svoju OPENQUERY tak, aby ste preniesli hodnotu do reťazca.To bude pomalé, ale bude pracovať.

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

EDIT:

Niečo iné by ste sa mohli pokúsiť vyhnúť OPENQUERY všetci spolu:

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