2015-03-16 5 views
2

У меня есть таблица, как показано ниже:Как выбрать значение из столбца XML в таблицы SQL

CREATE TABLE [dbo].[testdb](
    [Id] [int] NOT NULL, 
    [Description] [nvarchar](4000) NULL, 
CONSTRAINT [PK_testdb] PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

А вот значение:

INSERT INTO [TempTestDb].[dbo].[testdb] 
      ([Id] 
      ,[Description]) 
    VALUES 
      (<Id, int,> 
      ,'<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<retail:customerAttribute xmlns:core="http://www.ctor.com/core" xmlns:hta="http://docs.oasis-open.org/ns/bp4people/ws-humantask/api/200803" xmlns:htd="http://docs.oasis-open.org/ns/bp4people/ws-humantask/200803" xmlns:htt="http://docs.oasis-open.org/ns/bpel4people/ws-humantask/types/200803" xmlns:ns11="http://www.enactor.com/addressLookup/service" xmlns:ns13="http://www.ctor.com/retail/restaurantTableStatus/service" xmlns:ns4="http://www.enactor.com/crm" xmlns:ns5="http://www.ctor.com/retail/storedRetailTransaction/service" xmlns:ns7="http://www.enactor.com/retail/storedRestaurantSaleTransaction/service" xmlns:ns8="http://www.ctor.com/crm/customerLoyalty/service" xmlns:retail="http://www.ctor.com/retail" xmlns:sref="http://docs.oasis-open.org/wsbpel/2.0/serviceref" xmlns:tools="http://www.ctor.com/tools" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <retail:optionPathId>NEAREST_STORE</retail:optionPathId> 
    <retail:optionSetId type="customerAttributeSet" optionSetId="NEAREST_STORE"> 
     <retail:groupId groupHierarchyId="All" groupTypeId="region">All</retail:groupId> 
    </retail:optionSetId> 
    <retail:dataType>STRING</retail:dataType> 
    <retail:lastUpdated>2015-03-13T09:40:59.333Z</retail:lastUpdated> 
    <retail:value id="NEAREST_STORE"> 
     <retail:stringValue>001</retail:stringValue> 
    </retail:value> 
    <retail:customerId>2600009991693</retail:customerId> 
</retail:customerAttribute> 
') 
GO 

Я пытаюсь выбрать значение «розничной торговли: строковое значение'. Запрос, который я пытаюсь написать, кажется, не работает. Если кто-нибудь может мне посоветовать, пожалуйста.

Мой запрос на выборку:

SELECT TOP 1000 [Id] 
     ,[Description].value('(/retail:value/retail:stringValue/node())[1]', 'nvarchar(max)') as test 
    FROM [TempTestDb].[dbo].[testdb] 
+1

Если это XML, он похож на XML, quacks, как XML, - почему ** он не хранится ** как 'XML' ??? –

ответ

1

Предполагая столбцы имеет тип данных XML (как это должно быть), то вы должны соблюдать в XML-пространства имен, который участвует в вашем XML, чтобы получить значение - попробуйте этот код:

;WITH XMLNAMESPACES(DEFAULT 'http://www.ctor.com/retail') 
SELECT 
    [Id], 
    [Description].value('(/customerAttribute/value[1]/stringValue)[1]', 'nvarchar(100)') 
FROM 
    [TempTestDb].[dbo].[testdb] 

Если вы посмотрите внимательно на XML, то вы увидите, что большинство узлов префиксом XML префикс пространства имен:

<retail:customerAttribute 

и этот префикс преобразуется в пространство имен XML 'http://www.ctor.com/retail' - так ваш выбор в структуру XML, вы должны соблюдать, что пространство имен XML и включите его в XQuery - в противном случае вы получите null .....

+1

Получил эту ошибку: Msg 4121, Level 16, State 1, Line 2 Невозможно найти ни один столбец «Описание», либо определенную пользователем функцию или агрегат «Description.value», или имя неоднозначно. – Tun

+2

Я думаю, вы должны сначала преобразовать VARCHAR в XML - CAST ([Description] AS XML) – Kartic

+1

@coder: эти ** функции XQuery ** ТОЛЬКО ** работают над 'XML' - если у вас есть что-то еще, вы должны преобразовать это сначала! –

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