2011-04-06 4 views
0

SQL Server 2008에서 데이터를 XML로 출력하는 T-SQL 쿼리를 만들어야합니다. 그러나 이것은 열 이름에 공백이있을 수있는 다른 열을 사용하여 데이터를 쿼리하는 일반적인 프로세스입니다. 따라서 XML에서 열 이름을 특성으로 나열하고 싶습니다 (공백은 요소 이름에 허용되지 않습니다). 다를 수 있습니다 세부 레코드SQL Server 2008 - 열 이름이 특성으로 필요합니다.

<master id="123"> 
    <detail colname="customer">John Smith</detail> 
    <detail colname="amount">888.45</detail> 
    <detail colname="date">01/01/01</detail> 
</master> 
<master id="456"> 
    <detail colname="customer">Suzie Jones</detail> 
    <detail colname="amount">1000.25</detail> 
    <detail colname="date">05/05/01</detail> 
</master> 

열을, 그래서 나는 하드 코딩 할 수 없습니다

자식 레코드에 대한 상세 테이블로 연결되는 마스터 테이블을 감안할 때,이처럼 보이도록 출력을 원하는 것 그들.

나는 이것이 PIVOT 명령을 사용하여 가능할 수 있다고 생각하지만 데이터 구조를 알지 못하면 정말 추악해진다. 속성 값으로 표시 할 열 이름을 가져 오는 방법이 있어야한다고 생각합니다!

어떤 조언을 주셔서 감사합니다.

+0

코드, XML 또는 데이터 샘플을 게시하는 경우 텍스트 편집기에서 해당 행을 강조 표시하고 해당 코드 행의 "코드 샘플"버튼 ('{}) '을 클릭하십시오. 편집기 도구 모음을 멋지게 포맷하고 구문을 강조 표시합니다! –

답변

0

T-SQL에서 FOR XML 절을 사용

더 많은 예제 here

영업에 대한

업데이트 : 사용 FOR XML EXPLICIT 명시 적으로 열에서 속성 값을 설정합니다.

다른 EXPLICIT 예 :

http://blogs.technet.com/b/wardpond/archive/2006/09/08/454938.aspx

+0

FOR XML에서 하드 코딩하지 않고 열 이름을 특성으로 사용하는 예가 있다면 그 정보를보고 싶습니다. 감사. – KTH

+0

내 대답은 내 대답을 참조 –

+0

고마워, 엠제이,하지만 난 아직도 내가 필요로하지 않는 것 같아요. 속성의 열 이름이 필요합니다. firstname은 쿼리하는 테이블의 열 이름입니다. 하지만 firstname을 하드 코딩 할 수 없습니다. 테이블을 동적으로 쿼리하고 각 실행마다 열이 다릅니다. – KTH

0

은 조회에서 "XML은"사용할 수있는 방법이 있습니까? 이것은 당신을 위해 많이 들지 않습니다.

당신이있어 생각과 매우 유사이 페이지의 정보 뭔가 후 : http://msdn.microsoft.com/en-us/library/ms345137(v=sql.90).aspx

+0

FOR XML을 사용하고 있습니다. 그러나 문제는 열 이름이 요소가 아닌 속성으로 나타나도록하는 것입니다. 열 이름이 변경되어 하드 코드 할 수 없습니다. – KTH

0

할 수 있습니다 다음과 같은 것을 할 수있는 저장 프로 시저를 만들 :

if exists (select * from dbo.sysobjects where id = object_id(N'[QueryXML]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) 
drop procedure QueryXML 
GO 
create procedure QueryXML 
    @Columns VarChar(1000), 
    @Table VarChar(100) 
as 
begin 
    declare @query varchar(1100) 

    set @query = 'select (select ' + @Columns + ' from ' + @Table + ' for XML PATH(''columns'')) for XML PATH(''''), ROOT (''SampleXML'')' 

    exec (@query) 

end 

내가이 테이블을 시도

create table dummy1(
    ID int not null identity(1,1), 
    dummy1 int, 
    dummy2 int, 
    dummy3 int 
) 
GO 

insert into dummy1 (dummy1,dummy2,dummy3) values(1,2,3) 
insert into dummy1 (dummy1,dummy2,dummy3) values(4,5,6) 
insert into dummy1 (dummy1,dummy2,dummy3) values(7,8,9) 
insert into dummy1 (dummy1,dummy2,dummy3) values(10,11,12) 
insert into dummy1 (dummy1,dummy2,dummy3) values(13,14,15) 
insert into dummy1 (dummy1,dummy2,dummy3) values(16,17,18) 

예 :

exec QueryXML @Columns = 'ID, dummy1', @Table = 'dummy1' 
exec QueryXML @Columns = 'ID, dummy2,dummy3', @Table = 'dummy1' 
exec QueryXML @Columns = 'ID, dummy1,dummy2,dummy3', @Table = 'dummy1' 

당신은 또한 검토 할 수는 XQuery에게 간단한 XML 행 집합을 사용하여 sql-server-simple-example-of-creating-xml-file-using-t-sql

+0

올바른 방향으로 향하고 있다고 생각하지만 그렇지 않습니다. 너의 샘플을 운영하는 나를 위해 일해라. 출력 < 열 > < ID .... 이런 모습 > 1 </ID > <dummy1> 1 < – KTH

2

는 다음과 같이 출력을 생성 필요한 형식

DECLARE @X xml = '<row id="123" customer="John Smith" amount="888.45" date="01/01/01" />' 
       +'<row id="456" customer="Suzie Jones" amount="1000.25" date="05/05/01" />' 

SELECT @X.query 
     (
      ' 
      for  $id in //row/attribute::id 
      return <master id="{ string($id) }"> 
         { 
          for $attr in //row[@id=$id]/attribute::* 
          where local-name($attr) != "id" 
          return <detail columnname="{ local-name($attr) }">{ string($attr) }</detail> 
         } 
        </master> 
      ' 
     ) 
1

또 하나의 옵션으로 피봇 할 수 있습니다합니다 (의 공간을 통지 열 이름) :

<root> 
    <master id="123"> 
    <detail 
     customer_x0020_name="John Smith" 
     amount="888.4500" 
     date="2001-01-01" 
    /> 
    </master> 
    <master id="456"> 
    <detail 
     customer_x0020_name="Suzie Jones" 
     amount="1000.2500" 
     date="2001-05-05" 
    /> 
    </master> 
</root> 

이 스크립트 사용 :

SELECT 
    master.id, 
(
    SELECT 
     detail.[customer name], 
     detail.amount, 
     detail.[date] 
    FROM dbo.detail AS detail 
    WHERE 
     detail.master_id = master.id 
    FOR XML AUTO, TYPE 
) 
FROM dbo.master_table AS [master] 
FOR XML AUTO, TYPE, ROOT('root') 
,691을

...이 샘플 데이터를 사용하여 :

CREATE TABLE dbo.master_table 
(
    id INTEGER PRIMARY KEY 
) 

CREATE TABLE dbo.detail 
(
    master_id  INTEGER NULL REFERENCES dbo.master_table, 
    [customer name] VARCHAR(30) NULL, 
    amount   MONEY NULL, 
    [date]   DATE NULL 
) 

INSERT dbo.master_table 
    (id) 
VALUES 
    (123), 
    (456) 

INSERT dbo.detail 
    (master_id, [customer name], amount, [date]) 
VALUES 
    (123, 'John Smith', $888.45, '2001-01-01'), 
    (456, 'Suzie Jones', $1000.25, '2001-05-05')