Dit is een tekortkoming in SQL Server. Het loutere bestaan van een xml-kolom in de tabel voorkomt dat deze deelneemt aan gedistribueerde zoekopdrachten (bijv. bevraagd via een gekoppelde serververbinding). Dit staat vermeld in deze 'gepensioneerde' documentatie. In de documentatie van de huidige versie lijkt dit niet te worden vermeld.
Vroeger waren er relevante bugrapporten op Microsoft Connect, maar dat is nu 'met pensioen' ten gunste van de Azure-feedbackforums. Dit feedbackitem wordt afgesloten met een instructie om "feedback rechtstreeks vanuit de productdocumentatie in te dienen", wat prima zou zijn als de productdocumentatie dit daadwerkelijk zou vermelden. Dit andere feedbackitem bevat commentaar dat is gemigreerd vanuit Connect en heeft de status 'Niet gepland'.
Een van de Connect-bugrapporten die er waren, gaf twee tijdelijke oplossingen:
Maak [een] weergave zonder de XML-kolom(men) op de externe server en bevraag die.
In uw voorbeeld zou dit betekenen dat u een weergave toevoegt aan
MyDatabase
dat ziet er zo uit:CREATE VIEW V_T_B AS SELECT Id FROM T_B;
U kunt deze weergave vervolgens opvragen via de link om de
Id
. te krijgen gegevens. Merk op dat zoiets alsSELECT Id FROM ( SELECT Id FROM T_B ) T_B;
niet werk.
Gebruik een pass-through-query in het formulier
SELECT * from OPENQUERY (... )
Deze methode heeft het voordeel dat er geen wijziging in de brondatabase nodig is; het nadeel is dat het niet langer mogelijk is om standaard vierdelige naamgeving te gebruiken voor zowel lokale als gekoppelde gegevens. De vraag zou er als volgt uitzien:
SELECT Id FROM OPENQUERY(DATA02, 'SELECT Id FROM T_B') T_B;
Merk op dat als je echt doe de xml-gegevens wilt, is deze methode (samen met het casten van en naar een niet-xml-gegevenstype) vereist :
SELECT Id, CAST(Stuff AS XML) Stuff FROM OPENQUERY(DATA02, 'SELECT Id, CAST(Stuff AS nvarchar(max)) Stuff FROM T_B') T_B;
Merk op dat de bug voor het eerst werd gemeld in SQL Server 2005, en nog steeds niet is opgelost in SQL Server 2017. Ik heb SQL Server 2019 nog niet kunnen controleren.