비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 버그 보고서 중 하나는 두 가지 해결 방법을 제공했습니다.
-
원격 서버에 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;
작동하지 않습니다.
-
양식에서 통과 쿼리 사용
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에서 사용할 수 있습니다.
저는 이것을 할 수 있는 다른 방법을 찾았습니다.
- 작성
Linked Server
에DATA01
,DATA02
또는 일부 세 번째 서버(로컬일 수 있음). - 다음을 사용하여 쿼리 실행
EXEC [linked_server].[sp_executesql]
.
보기를 만들거나 사용하는 것보다 이 방법을 선호하는 이유OPENQUERY
?
- 이 방법은 연결된 서버에 대한 사용 권한이 필요하지 않습니다(보기를 작성할 필요 없음).
- 다음을 사용하여 쿼리에 매개 변수를 전달할 수 있습니다.
sp_executesql
구문(sp_sqlexecute에 대한 자세한 내용은 여기에서 확인하십시오.위해서OPENQUERY
당신은 a를STRING
또는TEXT_LEX
witch는 모든 값을 이 함수에 바로 입력해야 함을 의미합니다.
다음은 예입니다.
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
'programing' 카테고리의 다른 글
Vuejs/Vuex에서 반응성(기본값) 속성을 만드는 올바른 방법은 무엇입니까? (0) | 2023.06.27 |
---|---|
sqlplus 현재 연결된 데이터베이스 세션의 세부 정보를 찾는 방법 (0) | 2023.06.27 |
'git submodule'을 사용하여 특정 버전의 서브모듈을 체크아웃하려면 어떻게 해야 합니까? (0) | 2023.06.22 |
Git: 분기에 대해 기본적으로 구성된 원격은 무엇입니까? (0) | 2023.06.22 |
WHERE 조건 없이 SQL Server의 테이블에서 '첫 번째' 레코드 삭제 (0) | 2023.06.22 |