2010-06-16 2 views
2

xml 유형의 입력 매개 변수를 수락하여 트랜잭션의 보험 계획 목록을 수락 할 수 있습니다. xml 매개 변수를 가져 와서 테일 변수로 파쇄해야 일부 논리를 처리 할 수 ​​있습니다. XML을 내 테이블 변수에 어떻게 파쇄 할 수 있습니까?xml 입력 매개 변수를 테이블 변수에 파쇄하는 방법

여기에 데이터가있는 샘플 표를 생성하는 스크립트가 있습니다.

/* 
CREATE TABLE PlanData(PlanPos INT IDENTITY, PayerDX INT, PlanDX INT, PayPct DECIMAL(6,2)) 

INSERT PlanData(PayerDX, PlanDX, PayPct) 
VALUES(10, 20, 80) 
INSERT PlanData(PayerDX, PlanDX, PayPct) 
VALUES(25, 50, 10) 

drop table PlanData 
*/ 

DECLARE @xmlPlans XML 
SET @xmlPlans = (SELECT PlanPos, PayerDX, PlanDX, PayPct 
       FROM PlanData 
       ORDER BY PlanPos 
       FOR XML RAW('plan'), ROOT('plans') 
       ) 

print CAST(@xmlPlans AS NVARCHAR(max)) 

/* We must convert the XML passed in containing all of the insurance payer plan 
data into a usable format for the current scoping. */ 
DECLARE @tblPlans TABLE(PlanPos INT, IPDX INT, IPPDX INT, PayPct decimal(6, 2)) 

-- /* Note that the table is built in order from Primary through the last plan */ 
-- INSERT @tblPlans (PlanPos, IPDX, IPPDX, PayPct) 
-- SELECT x.item.value('@PlanPos[1]', 'INT') AS PlanPos, 
--  x.item.VALUE('@IPDX[1]', 'INT') AS IPDX, 
--  x.item.VALUE('@IPPDX[1]', 'INT') AS IPPDX, 
--  x.item.VALUE('@PayPct[1]', 'decimal(6, 2)') AS PayPct 
-- FROM @xmlPlans.nodes('//items/item') AS x(item) 


    INSERT @tblPlans (PlanPos, IPDX, IPPDX, PayPct) 
    SELECT T.plann.value('@PlanPos', 'int') AS PlanPos 
     ,T.plann.VALUE('@PayerDX', 'INT') AS IPDX 
     ,T.plann.VALUE('@PlanDX', 'INT') AS IPPDX 
     ,T.plann.VALUE('@PayPct', 'decimal(6, 2)') AS PayPct 
    FROM @xmlPlans.nodes('plans/plan') as T(plann) 


---- Attribute-centered XML 
--DECLARE @data XML 
--SET @data = '<data><customer id="1" name="Allied Industries"/><customer id="2" name="Trades International"/></data>'; 
-- 
--DECLARE @tblCust TABLE(id INT, [name] VARCHAR(20)) 
-- 
-- 
---- Using the value() method 
--INSERT @tblCust (id, [name]) 
--SELECT T.customer.value('@id', 'INT') AS customer_id, 
--  T.customer.value('@name', 'VARCHAR(20)') AS customer_name 
--FROM @data.nodes('data/customer') AS T(customer); 
-- 
--SELECT id AS dx, name AS CustName FROM @tblCust 



-- SELECT x.item.value('@PlanPos[1]', 'INT') AS PlanPos, 
--  x.item.VALUE('@IPDX[1]', 'INT') AS IPDX, 
--  x.item.VALUE('@IPPDX[1]', 'INT') AS IPPDX, 
--  x.item.VALUE('@PayPct[1]', 'decimal(6, 2)') AS PayPct 
-- FROM @xmlPlans.nodes('//items/item') AS x 

    SELECT 
     p.PlanPos AS PlanPos, 
     p.IPDX AS IPDX, 
     p.IPPDX AS IPPDX, 
     p.PayPct AS PayPct 
    FROM @tblPlans p 

나에게도 실패한 시도가 표시됩니다.

브라이언에게,

+0

코드 또는 XML을 게시하는 경우 ** 텍스트 편집기에서 해당 행을 강조 표시하고 편집기 툴바에서 "코드"버튼 (101 010)을 클릭하여 멋지게 형식을 지정하고 구문을 강조 표시하십시오! –

+0

팁을 주셔서 감사합니다 –

답변

2

확인을 주셔서 감사합니다, 나는 테이블을 시도하고 난 당신 FOR XML RAW..... 문에서 다음과 같은 출력을 얻을 :

<plans> 
    <plan PlanPos="1" PayerDX="10" PlanDX="20" PayPct="80.00" /> 
    <plan PlanPos="2" PayerDX="25" PlanDX="50" PayPct="10.00" /> 
</plans> 

이제 당신이 데려 가고 싶다는 않는 이러한 속성 중 어느 어떤 테이블 변수의 열에 ?? x.item.value(...) 문에 사용 된 속성 이름이 FOR XML 문에서 XML 결과에 실제로 사용 가능한 것과 일치하지 않습니다.

이 시도 :

DECLARE @tblPlans TABLE(PlanPos INT, IPDX INT, IPPDX INT, PayPct decimal(6, 2)) 

INSERT @tblPlans (PlanPos, IPDX, IPPDX, PayPct) 
    SELECT x.item.value('@PlanPos[1]', 'INT') AS PlanPos, 
     x.item.value('@PayerDX[1]', 'INT') AS IPDX, 
     x.item.value('@PlanDX[1]', 'INT') AS IPPDX, 
     x.item.value('@PayPct[1]', 'decimal(6, 2)') AS PayPct 
    FROM @xmlPlans.nodes('//plans/plan') AS x(item) 

SELECT * FROM @tblPlans 

그에서이 출력을 얻을 :

PlanPos IPDX IPPDX PayPct 
    1   10  20  80.00 
    2   25  50  10.00 

를 아니면 당신이 정말로 찾고있는 그 무엇인가?

+0

아니, 당신은 그것을 얻었다! 대단히 감사합니다 –

+0

아하! 그 외에도 또 다른 문제는 "가치"가 아니라 "가치"가 있다는 것입니다 ... –

+0

아, 네 - 그 XQuery 함수 *는 대소 문자를 구분합니다! –

관련 문제