2014-09-09 5 views
0

Я пытаюсь получить подстроку, FIRST_NAME, значение атрибута от ADDRESS_XML столбец в таблице, используя простой запрос выбора. Тип столбца: varbinary(1000).Как получить значение подстроки из столбца Sql типа varbinary?

GetXml - это специальный метод, определенный в другом месте, который отлично работает.

Мои, где положение является

dbo.GetXml(ADDRESS_XML).exist('xpathExpression') = 1 

Ниже одна строка столбца ADDRESS_XML:

<PostalAddress xmlns="http://tempuri.org/PostalAddress.xsd"> 
    <PostalAddress TITLE="Mr" FIRST_NAME="John" LAST_NAME="SMITH" 
        ADDRESS="207a Stratford Road, Shirley" CITY="Solihull" 
        COUNTY="West Midlands" POSTCODE="B90 3AH" 
        COUNTRY="United Kingdom" CONTACT_INFO="" 
        EMAIL_ADDRESS="" PHONENO="" /> 
    </PostalAddress> 

Что должно быть выражение XPath?

Я использую SQL Server 2008 R2 Express В столбце varbinary хранится строка как hex, поэтому я использую на ней собственный метод GetXml().

+1

*** Почему *** вы хранящей совершенно правильный XML в 'столбце VARBINARY'?!?!? Не имеет никакого смысла ..... если выглядит как XML, пахнет XML, трюки, такие как XML, - это, вероятно, ** IS ** XML и должно рассматриваться как таковое и храниться ** как ** 'XML' ... .. –

+0

Я на работе - у меня нет контроля над плохими практиками нашей кодовой базы :) – 2014-09-09 13:15:38

+0

Ваши вопросы непонятны. Вы говорите о XML, хранящемся как varbinary, но у вас есть функция, которая возвращает XML, так что часть уже позаботилась о правильном? Вы хотите, чтобы выражение XPath получало значение 'FIRST_NAME', и ваш примерный запрос использует' exist' в предложении where, которое является проверкой существования узлов вместо возвращаемых значений. Вы не можете вернуть значение в 'exist'. Вы можете сравнить значение 'FIRST_NAME' с константой или переменной, но это не похоже на то, что вы ищете. –

ответ

0

Поскольку вы спросили, здесь есть выражение XPath для получения FIRST_NAME атрибута:

/PostalAddress/PostalAddress/@FIRST_NAME 

или если вы имели в виду, чтобы получить <PostalAddress>, имеющие FIRST_NAME значение атрибута равно 1:

/PostalAddress/PostalAddress[@FIRST_NAME='1'] 

Вам может понадобиться сначала зарегистрируйте пространство имен по умолчанию (MSDN: Specifying Default Namespace). Хотя, я не уверен, как вы намеревались использовать XPath точно.

1

Вы можете использовать sql:variable() для использования переменной в предикате в функции exist.

declare @FirstName nvarchar(100) = 'John'; 

with xmlnamespaces(default 'http://tempuri.org/PostalAddress.xsd') 
select * 
from T 
where dbo.GetXml(ADDRESS_XML).exist('/PostalAddress/PostalAddress[@FIRST_NAME = sql:variable("@FirstName")]') = 1; 

Или против постоянного значения в XPATH

with xmlnamespaces(default 'http://tempuri.org/PostalAddress.xsd') 
select * 
from T 
where dbo.GetXml(ADDRESS_XML).exist('/PostalAddress/PostalAddress[@FIRST_NAME = "John"]') = 1; 
+0

Ни один из вышеперечисленных предложений не возвратил никакого набора результатов, но также и у меня не было никаких ошибок! – 2014-09-10 13:22:37

+0

@dotNetBlackBelt Хорошо, очень сложно сказать, что вы сделали неправильно, без какого-либо кода, который воспроизводит то, что вы видите. [Вот скрипт SQL] (http://sqlfiddle.com/#!6/666e4/1), который доказывает, что он действительно работает так, как ожидалось. Возможно, вы просто пропустили некоторые крошечные детали, подобные тому, что XML чувствителен к регистру. –

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