2011-03-17 3 views
6

XML이라는 테이블 (SQL Server 2008의 경우)이 XmlDocumentXML 인 필드가 있습니다. XML 변수에서 특성을 삭제하려고합니다. 내 XML은SQL Server 2008의 XML 변수에서 특성을 삭제하는 방법은 무엇입니까?

<clue_personal_auto xmlns="http://cp.com/rules/client"> 
    <admin> 
    <receipt_date>03/16/2011</receipt_date> 
    <date_request_ordered>03/16/2011</date_request_ordered> 
    <report_usage>Personal</report_usage> 
    </admin> 
</clue_personal_auto> 

내 쿼리처럼 보이는 방법은 다음과

이다

UPDATE XML 
SET XmlDocument.modify('delete (/clue_personal_auto/@xmlns)[1]') 
WHERE xmlid = 357 

내가 쿼리 분석기에서이 쿼리를 실행하면 I 메시지 "1 개 행 적용됨"그러나 실제로 참조 clue_personal_auto 요소의 xmlns 속성이 제거되지 않습니다. 어떤 생각인지 내가 뭘 잘못하고 있는지. 그렇지 않으면 "/ clue_personal_auto"

감사 BB

+2

(영향을받는 행)은 단순히 업데이트를 수행했음을 의미합니다. 타임 스탬프 열이있는 경우 변경됩니다. 'update tbl set id = id'도 성공하지만 아무것도하지 않습니다. – RichardTheKiwi

+0

SQL 서버 기능'.modify()'는 공급 업체의 [XML 데이터 수정 언어] (http://msdn.microsoft.com/ ko-kr/library/ms177454.aspx) –

답변

2

제거

예 -하지만 진짜 문제는 남아있다 : ​​가 왜 네임 스페이스를 제거 하시겠습니까? WITH XMLNAMESPACES ... 구조를 사용하면 쉽게 네임 스페이스를 사용할 수 있습니다.

XML 이름 공간에 대해 배우고 사용하기 시작하는 대신 많은 노력을 기울여야합니다.

;WITH XMLNAMESPACES (DEFAULT 'http://cp.com/rules/client') 
SELECT 
    XmlDocument.value('(/clue_personal_auto/admin/report_usage)[1]', 'varchar(25)') 
FROM XML 
WHERE ID = 357 

을하고 그것으로 행복 - 인위적으로 더 이상 xmlns= 선언을 제거 할 필요가 :

당신은 아주 쉽게 쿼리에 해당 XML 네임 스페이스를 사용할 수 없습니다!

+0

Marc_s 덕분에 도움이되고 효과를 얻었습니다. :-) – BumbleBee

+1

이름 공간을 제거하는 한 가지 이유는 이전에 결코 작업 해 보지 못한 많은 레거시 코드를 깨기 때문입니다. 내 응용 프로그램에서 네임 스페이스는 아무런 목적도 가지고 있지 않습니다 (기존 XPath 명령이 작동을 멈추게하는 것을 제외하고). –

4

당신은 WITH xmlnamespaces를 사용할 필요는 네임 스페이스 clue_personal_auto xmlns="..." 노드와 일치하지 않습니다.

뿐만 아니라 일반 속성이 아니기 때문에 실제로 네임 스페이스를 제거 할 수 없습니다. 일반 속성 나는이 작업을 수행 할 수있는 쉬운 방법을 찾을 수 없습니다

declare @xml table (xmlid int, xmldocument xml) 
insert @xml select 357, ' 
<clue_personal_auto xmlns="http://cp.com/rules/client" otherattrib="x"> 
    <admin> 
    <receipt_date>03/16/2011</receipt_date> 
    <date_request_ordered>03/16/2011</date_request_ordered> 
    <report_usage>Personal</report_usage> 
    </admin> 
</clue_personal_auto>' 

;WITH XMLNAMESPACES ('http://cp.com/rules/client' as ns) 
UPDATE @XML 
SET XmlDocument.modify('delete (/ns:clue_personal_auto/@otherattrib)[1]') 
WHERE xmlid = 357 

select * from @xml 
+0

리차드에게 감사드립니다. – BumbleBee

4
UPDATE XML 
    SET CONVERT(XML, REPLACE(CONVERT(NVARCHAR(MAX), XmlDocument), N' xmlns=...')) 
WHERE ID = 357 
+0

니스 - 무력하지만 효과적입니다! –