2010-02-07 2 views
1

내가 동적 생성 한 XML 파일동적 XML

-----Example1----- 
<items> 
<param1>aaaa</param1> 
<param2>bbbb</param2> 
<param3>cccc</param3> 
</items> 
-----Example2----- 
<items> 
<test1>dddd</test1> 
<test7>eeee</test7> 
<john1>ffff</john1> 
<john2>ffff</john2> 
</items> 

내가 이

-----SQL TABLE for Example1----- 
Name  Value 
param1 aaaa 
param2 bbbb 
param3 cccc 
-----SQL TABLE for Example2----- 
Name  Value 
test1 dddd 
test7 eeee 
john1 ffff 
john2 ffff 

문제처럼 테이블이 XML 파일을 변환 할 - 상품 XML 태그 이름이 다른 각 xml 파일 (예 : 샘플) - 항목 번호는 각 xml 파일마다 다릅니다.

누구나 사용하실 수 있습니다.

C#에서 6,

갱신 1 샘플 내가했던 그하지만 난 T-SQL :(

public static void test() 
    { 

     string test = @" 
     <items> 
     <param1>aaaa</param1> 
     <param2>bbbb</param2> 
     <param3>cccc</param3> 
     </items> 
     "; 

     XmlDocument newdoc = new XmlDocument(); 
     XmlNode root = newdoc.CreateElement("dataset"); 
     newdoc.AppendChild(root); 
     XmlDocument doc = new XmlDocument(); 
     doc.InnerXml = test; 
     XmlNodeList lst = doc.SelectNodes("//items/*"); 
     foreach (XmlNode item in lst) 
     { 
      Console.WriteLine(item.Name + ": " + item.InnerXml); 
     } 
    } 

결과 PARAM1에서이 작업을 수행 할 필요가 : AAAA PARAM2 : 3 당겨 BBBB : CCCC

UPDATE2는 partialy 해결 내가하기 만하면 XML 태그 이름을 얻을

declare @foo xml 
set @foo = N' 
<items> 
     <param1>aaaa</param1> 
     <param2>bbbb</param2> 
     <param3>cccc</param3> 
</items>' 

SELECT 
'' as name, --?? no idea how to get names param1,param2,param3 
bar.value('./.','VARCHAR(14)') as value 
FROM 
@foo.nodes('/items/*') AS foo(bar) 

답변

1

이는 XSLT는 변환하는 변환 만들 상대적으로 쉬울 것이다 XML 데이터를 INSERT INTO 문 세트로 변환합니다. 그런 다음 그 문장을 실행할 수 있습니다. 이 접근법이 얼마나 유용한지는 데이터의 양과 가져 오기 속도에 달려 있습니다.

테이블이 아직없는 경우에도 XSLT를 사용하여 CREATE TABLE DDL을 수행 할 수도 있습니다.

UPDATE : 코드를 사용하여이 , 로컬 이름을 사용할 수 있습니다() 함수 :

declare @foo xml 
set @foo = N' 
<items> 
     <param1>aaaa</param1> 
     <param2>bbbb</param2> 
     <param3>cccc</param3> 
</items>' 

SELECT 
bar.value('local-name(.)','VARCHAR(14)') as name, 
bar.value('./.','VARCHAR(14)') as value 
FROM 
@foo.nodes('/items/*') AS foo(bar) 
+0

내가 TSQL에서 간단한 방법이 필요합니다, 나는 2,3 후, C#을 (게시 샘플)에서이 작업을 수행 할 수 있습니다 시간은 내가 선언 @foo XML 설정 @foo = N ' AAAA ...이 TSQL에서 spliting 문자열을 대체하여 수행하지만 난 이런 식으로 뭔가를 선택 XML을 사용하여 간단한 방법이 있다고 생각 얻을 수 있습니다 CCCC BBBB 이름 ' SELECT '- ?? 아무 생각이 없다 bar.value ('./ param1 [1]', 'VARCHAR (14)') 값으로 - 멀티 행을 얻으려는 아이디어가 없다. FROM @foo.nodes ('/ items') AS foo bar) – wicherqm

+0

감사합니다. bar.value ('local-name (.)', 'VARCHAR (14)') ":) – wicherqm