2010-12-08 8 views
3

properties이라는 데이터 형식 xml의 열이있는 People이라는 테이블이 있습니다. 필자는 기본적으로 각 사람에 대한 임의의 정보를 저장하여 데이터베이스 재 디자인없이 미래에 추가되는 추가 데이터를 저장할 수 있도록했습니다. 모든 사람들이 XML에서 동일한 요소를 갖지는 않습니다.SQL Server 2005 XML 열 데이터 쿼리

CREATE TABLE [dbo].[Person](
[PersonID] [bigint] IDENTITY(1,1) NOT NULL, 
[PersonType] [nvarchar](50) NULL, 
[Title] [nvarchar](5) NULL, 
[Forename] [nvarchar](60) NULL, 
[Surname] [nvarchar](60) NULL, 
[Company] [nvarchar](60) NULL, 
[Properties] [xml] NULL 
) 

는 XML의 예는 다음과 같습니다

<PropertyList xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Property Name="Class">Class A</Property> 
    <Property Name="CarRegistration">123456</Property> 
    <Property Name="MedicalNotes">None</Property> 
</PropertyList> 

첫 번째 질문은 내가 나를에 저장된 기준과 일치하는 기록의 목록을 얻을 수 있도록하는 SQL 쿼리를 찾을 수없는 것입니다 xml.

예를 들어 Class="Class A" 인 모든 레코드를 어떻게 얻을 수 있습니까? "싱글 톤 (또는 빈 시퀀스)이 필요합니다"

SELECT 
    PersonID, 
    Properties.value('/PropertyList/Property[@Name="Class"][1]','nvarchar(50)') 
FROM Person 

나는 이것이 잘못 알고 있지만 나는 오류와 나는 잘못 됐을 뭐죠 아주 확실하지 않다 : 나는 시도했습니다.

두 번째 문제는 여러 개의 이전 데이터베이스를 하나의 개인 목록에 결합했지만 이전 데이터베이스 프론트 엔드는 여전히 해당 데이터 비트에 액세스해야한다는 것입니다. 내 계획은 각 데이터베이스 프론트 엔드에 대한 레이아웃을 필요에 맞게 레이아웃을 작성하여 주 인 테이블로 다시 연결하는 것이 었습니다. 그러나 일부 필드는 이제 XML에 저장됩니다. xml을 보지 않고 XML을 업데이트하기위한 뷰를 생성하는 방법이 있습니까? 즉, 다른 테이블의 뷰처럼 보이고 작동합니다. 내가 올바르게 설명했으면 좋겠어. 각보기에 대해 편집 할 필요가있는 특정 XML 속성 집합을 갖게 될 것이고 모든 레코드가 그렇게 될 것이므로 무작위가 아닙니다.

도움 주셔서 감사합니다.

답변

5

귀하의 XQuery는해야한다 :

SELECT PersonID, 
     Properties.value('(/PropertyList/Property[@Name="Class"])[1]','NVARCHAR(50)') 
FROM dbo.Person 

가 도움이됩니까?

업데이트 : -이 값의 잠재적리스트로 평가되며, 다음 괄호 후 [1] 첫 번째를 선택 있도록 나는 /PropertyList/Property[@Name="Class"] 표현 주위에 괄호를 추가했습니다 (그리고는 다른 사람들이 명확하게하기 가장 자주 사용되는 경우에만) 해당 목록의 (싱글 톤으로) 값이므로 NVARCHAR(50) 문자열로 변환 될 수 있습니다.

value('(/PropertyList/Property[@Name="Class"])[1]','NVARCHAR(50)') 
     !          ! 

value('/PropertyList/Property[@Name="Class"][1]','NVARCHAR(50)') 

업데이트 2와 같은 하지입니다 : 당신이보기를 만들려면 - 확실하지 이유! ;-)

당신은 확실히 같은 것을 만들 수 있습니다 테이블에서

CREATE VIEW dbo.YourViewName 
AS 
    SELECT 
     PersonID, PersonType, Title, 
     ForeName, Surname, Company, 
     Properties.value('(/PropertyList/Property[@Name="Class"])[1]','NVARCHAR(50)') AS 'Class', 
     Properties.value('(/PropertyList/Property[@Name="CarRegistration"])[1]','NVARCHAR(50)') AS 'CarRegistration', 
     Properties.value('(/PropertyList/Property[@Name="MedicalNotes"])[1]','NVARCHAR(50)') AS 'MedicalNotes' 

및보기에 컬럼에 XML을 "분쇄". 그게 네가 찾고있는거야?

+0

정확하게 이미 시도한 바가 아닙니까? –

+0

@Ash Burlaczenko : ** NO !! ** XQuery 표현식에 괄호를 추가했습니다 (이 경우 필수적입니다!) 괄호 (원래 게시물)가 없으면 작동하지 않으며 오류가 발생합니다. - 내 괄호로 작동합니다. –

+0

@ marc_s : 왜 괄호가 차이를 만들어야하는지 설명 할 수 있습니까? 이론적으로, Properties 열 값이 여러/PropertyList 요소가있는 XML 문서 조각 일 수 있다면 괄호는 "Class라는 첫 번째 속성"과 "각 PropertyList의 클래스라는 첫 번째 속성"의 차이를 의미합니다. 그러나 각 Properties 칼럼 값이 단지 하나의/PropertyList 엘리먼트를 가졌다 고 가정한다면, 차이점은 없습니다, 맞습니까? 실제로 그의 예제에서 "Class"라는 Property는 하나 밖에 없으므로'[1]'은 전혀 차이가 없어야합니다. – LarsH