2013-03-14 2 views
0

Эта проблема действительно неприятная. У меня есть следующий маленький XML в столбце с именем «Сообщение», и я бы хотел запросить его. Проблема, с которой я столкнулась, связана с элементом «ClaimData». Как вы можете видеть, оно устанавливает пустое пространство имен.SQL Server - XML-колонка запроса с отсутствующим пространством имен

<DataExchange xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://schemas.abc.com/library/DataExchange"> 
    <Data> 
     <ClaimData xmlns=""> 
      <CurrentClaimNumber>TEST0000319001</CurrentClaimNumber> 
     </ClaimData> 
    </Data> 
</DataExchange>  

Запрос ниже возвращает NULL значения для столбца XML, так как элемент ClaimData использует пустое пространство имен, и я не знаю, как указать это в запросе столбца XML.

Может ли кто-нибудь дать рабочий (и, надеюсь, проверенный) пример запроса элемента «CurrentClaimNumber» (который является дочерним элементом «ClaimData») в столбце XML Message?

Спасибо, очень.

WITH XMLNAMESPACES (
    'http://www.w3.org/2001/XMLSchema' AS "xsd", 
    'http://www.w3.org/2001/XMLSchema-instance' AS "xsi", 
    DEFAULT 'http://schemas.rising.com/library/DataExchange' 
) SELECT [StoredMessageID], 
    Message.value('(/DataExchange/Data/ClaimData/CurrentClaimNumber)[1]', 'CHAR(750)') 
    FROM [DataExchange].[dbo].[MessageStorage] 

ответ

3

Как просто присваивать пространство имен по умолчанию префиксу, чтобы вы могли использовать пустое пространство имен без одного? Это может быть единственным вариантом:

WITH XMLNAMESPACES (
    'http://www.w3.org/2001/XMLSchema' AS "xsd", 
    'http://www.w3.org/2001/XMLSchema-instance' AS "xsi", 
    'http://schemas.abc.com/library/DataExchange' AS "de" 
) SELECT [StoredMessageID], 
    Message.value('(/de:DataExchange/de:Data/ClaimData/CurrentClaimNumber)[1]', 
                     'CHAR(750)') 
    FROM [DataExchange].[dbo].[MessageStorage] 

Проверенно следующим образом:

insert into MessageStorage values(' 
<DataExchange 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://schemas.abc.com/library/DataExchange"> 
    <Data> 
     <ClaimData xmlns=""> 
      <CurrentClaimNumber>TEST0000319001</CurrentClaimNumber> 
     </ClaimData> 
    </Data> 
</DataExchange>'); 


WITH XMLNAMESPACES (
    'http://www.w3.org/2001/XMLSchema' AS "xsd", 
    'http://www.w3.org/2001/XMLSchema-instance' AS "xsi", 
    'http://schemas.abc.com/library/DataExchange' AS "de" 
) SELECT [StoredMessageID], 
    Message.value('(/de:DataExchange/de:Data/ClaimData/CurrentClaimNumber)[1]', 
                     'CHAR(750)') 
    FROM [dbo].[MessageStorage] 

Результат:

1  TEST0000319001 
+0

Мой оригинальный XML был немного неправильно. Пространства имен должны появляться внутри элемента DataExchange. Я не думаю, что вы заметили это, хотя в вашем ответе. Ваше решение не работает, потому что элемент ClaimData НЕ использует пространство имен по умолчанию. Он использует пустое (т. Е. Отсутствует) пространство имен. –

+0

Он использует пустое пространство имен. Я знаю об этом. Если вы укажете пространство имен по умолчанию, вы не сможете получить доступ к пустому пространству имен. Вы попробовали мое решение или просто предположили, что это не сработает? – JLRishe

+0

Я попытался, но, похоже, я допустил ошибку. Действительно, он работает. Большое спасибо. Это сэкономило мне много времени. –

Смежные вопросы