programing

비XML 데이터에 대해 연결된 서버를 쿼리할 때 "Xml 데이터 유형이 분산 쿼리에서 지원되지 않습니다." 오류가 나타나는 이유는 무엇입니까?

powerit 2023. 6. 22. 22:33
반응형

비XML 데이터에 대해 연결된 서버를 쿼리할 때 "Xml 데이터 유형이 분산 쿼리에서 지원되지 않습니다." 오류가 나타나는 이유는 무엇입니까?

2008을 두 개 . 이름은 "SQL Server 2008"입니다.DATA01그리고.DATA02.DATA02에는 연결된 정의가 .LINK이 그점서를 것.DATA01적절한 사용자 매핑이 설정되어 있습니다.DATA01데이터베이스가 있습니다.MyDatabase다음 두 테이블 포함:

CREATE TABLE T_A (
    Id int
)

CREATE TABLE T_B (
    Id int,
    Stuff xml
)

에서 이 할 때DATA02예상대로 데이터가 반환됩니다.

SELECT Id FROM LINK.MyDatabase.dbo.T_A;

이실때행할에서 이 명령을 때DATA02오류가 발생합니다.

SELECT Id, Stuff FROM LINK.MyDatabase.dbo.T_B;

오류는

분산 쿼리에서는 Xml 데이터 유형이 지원되지 않습니다.원격 개체 'DATA02'입니다.MyDatabase.dbo.T_B'에 xml 열이 있습니다.

이상하게도, 이 명령어는

SELECT Id FROM LINK.MyDatabase.dbo.T_B;

또한 xml 열을 기록하고 있지만 동일한 오류가 발생합니다!무슨 일이야?

이는 SQL Server 내의 결함입니다.테이블에 xml 열이 있는 만으로도 분산 쿼리에 참여할 수 없습니다(예: 연결된 서버 연결을 통해 쿼리됨). 문제는 이 '사용 중지' 설명서에 언급되어 있습니다.현재 버전의 설명서에는 이에 대한 언급이 없는 것 같습니다.

이전에는 Microsoft Connect에 관련 버그 보고서가 있었지만 이제는 Azure 피드백 포럼을 위해 '폐기'되었습니다.이 피드백 항목은 "제품 설명서에서 직접 피드백을 제출하십시오."라는 지침과 함께 닫혔습니다. 제품 설명서에서 실제로 이 내용을 언급했다면 문제가 없을 것입니다.이 다른 피드백 항목에는 Connect에서 마이그레이트된 설명이 포함되어 있으며 '계획되지 않음' 상태입니다.

이전에 존재했던 Connect 버그 보고서 중 하나는 두 가지 해결 방법을 제공했습니다.

  1. 원격 서버에 XML 열 없이 [a] 보기를 만들고 쿼리합니다.

    ▁to▁view에 보기를 추가하는 것을 포함합니다.MyDatabase다음과 같이 표시됩니다.

    CREATE VIEW V_T_B AS SELECT Id FROM T_B;
    

    그런 이 쿼리를 하여 그런다음보쿼다얻수있다습니을음을리여하기를이통해링크를을 얻을 수 .Id로 와 같은 것입니다. 참고로 다음과 같은 것이 있습니다.

    SELECT Id FROM ( SELECT Id FROM T_B ) T_B;
    

    작동하지 않습니다.

  2. 양식에서 통과 쿼리 사용

    SELECT * from OPENQUERY (... )
    

    이 방법은 원본 데이터베이스를 변경할 필요가 없다는 장점이 있습니다. 단, 로컬 및 연결된 데이터 모두에 대해 더 이상 표준 4부 명명을 사용할 수 없습니다.쿼리는 다음과 같습니다.

     SELECT Id FROM OPENQUERY(DATA02, 'SELECT Id FROM T_B') T_B;
    

    실제로 xml 데이터를 원하는 경우 이 방법(비 xml 데이터 유형으로 또는 xml 데이터 유형에서 캐스팅)이 필요합니다.

     SELECT Id, CAST(Stuff AS XML) Stuff 
     FROM OPENQUERY(DATA02, 'SELECT Id, CAST(Stuff AS nvarchar(max)) Stuff 
                             FROM T_B') T_B;
    

이 버그는 SQL Server 2005에서 처음 보고되었으며 SQL Server 2017에서는 수정되지 않은 상태로 남아 있습니다.아직 SQL Server 2019를 확인하지 못했습니다.

사용해 보십시오.

  • nvarchar(max)에 xml 캐스트를 사용하여 소스 측에 뷰를 만듭니다.

T_B에서 선택 캐스트로 보기 vXML 테스트 생성(nvarchar(max))

  • xml로 캐스트하여 대상 측에서 선택할 수 있습니다.

캐스트(XML로 채우기)를 열린 쿼리의 채우기로 선택(DATA02, 'vXML 테스트에서 채우기 선택')

이 솔루션은 2008R2에서 사용할 수 있습니다.

저는 이것을 할 수 있는 다른 방법을 찾았습니다.

  1. 작성Linked ServerDATA01,DATA02또는 일부 세 번째 서버(로컬일 수 있음).
  2. 다음을 사용하여 쿼리 실행EXEC [linked_server].[sp_executesql].

보기를 만들거나 사용하는 것보다 이 방법을 선호하는 이유OPENQUERY?

  1. 이 방법은 연결된 서버에 대한 사용 권한이 필요하지 않습니다(보기를 작성할 필요 없음).
  2. 다음을 사용하여 쿼리에 매개 변수를 전달할 수 있습니다.sp_executesql구문(sp_sqlexecute에 대한 자세한 내용은 여기에서 확인하십시오.위해서OPENQUERY당신은 a를STRING또는TEXT_LEXwitch는 모든 값을 이 함수에 바로 입력해야 함을 의미합니다.

다음은 예입니다.

DECLARE @UserID UNIQUEIDENTIFIER = ''

DECLARE @SearchForUserParams NVARCHAR(MAX) = N'@UserID UNIQUEIDENTIFIER';  
DECLARE @SearchForUserQuery NVARCHAR(MAX) = 
N'SELECT
    UserID,
    Username,
    Email,
    CONVERT(NVARCHAR(MAX), UserDataXml) AS UserDataXml
FROM User
WHERE UserID = @UserID'

EXEC [linked_server].[dbo].[sp_executesql] 
    @SearchForUserQuery,
    @SearchForUserParams,
    @UserID = @UserID

언급URL : https://stackoverflow.com/questions/14442039/why-do-i-get-the-error-xml-data-type-is-not-supported-in-distributed-queries-w

반응형