Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 вытащить значение из xml  [new]
dolf85
Member

Откуда:
Сообщений: 58
Всем привет, видел много тем примерных, но все равно немного не понятно, если не сложно подскажите:
select ExtraInfo from Terminals where TerminalID=4;
выдает значение в столбце с надписью (Excluded) - если правой клавишей мыши, то поле отображается нормально, пользуюсь Toad for SQL Server, как сделать, чтобы сразу нормально отображалось?
вопрос 2: этим запросом выдается строка
<?xml version="1.0" encoding="Windows-1251"?><root><region></region><paydeskid>4</paydeskid></root>
не подскажите как вытащить значение, которое внутри </paydeskid>? причем в некоторых строках вообще может не быть параметра </paydeskid>.
24 окт 12, 12:57    [13367990]     Ответить | Цитировать Сообщить модератору
 Re: вытащить значение из xml  [new]
dolf85
Member

Откуда:
Сообщений: 58
вопрос 1 насчет отображения уже нашел фишку, остается только вопрос 2, как вытащить значение.
24 окт 12, 13:03    [13368033]     Ответить | Цитировать Сообщить модератору
 Re: вытащить значение из xml  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
dolf85,

declare @x xml = '<?xml version="1.0" encoding="Windows-1251"?><root><region></region><paydeskid>4</paydeskid></root>'

select @x.value('(root/paydeskid/text())[1]','int')
24 окт 12, 13:04    [13368047]     Ответить | Цитировать Сообщить модератору
 Re: вытащить значение из xml  [new]
dolf85
Member

Откуда:
Сообщений: 58
я новичок и не совсем понимаю, делаю:
declare @x TABLE (data text)
insert @x
select ExtraInfo from Terminals where TerminalID=4
select @x.value('(root/paydeskid/text())[1]','int')

SQL Server Database Error: Must declare the scalar variable "@x".
24 окт 12, 17:01    [13370055]     Ответить | Цитировать Сообщить модератору
 Re: вытащить значение из xml  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
dolf85,

а увас @x ето таблица ,а вы к ней пытаетесь применить метод типа xml

автор
declare @x TABLE (data text)
......
select @x.value('(root/paydeskid/text())[1]','int')
24 окт 12, 17:36    [13370283]     Ответить | Цитировать Сообщить модератору
 Re: вытащить значение из xml  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
dolf85
я новичок и не совсем понимаю, делаю:
declare @x TABLE (data text)
insert @x
select ExtraInfo from Terminals where TerminalID=4
select @x.value('(root/paydeskid/text())[1]','int')

SQL Server Database Error: Must declare the scalar variable "@x".

declare @t table ( somexml xml )
insert  into @t
        ( somexml )
values  ( '<?xml version="1.0" encoding="Windows-1251"?><root><region></region><paydeskid>4</paydeskid></root>' )
        ,
        ( '<?xml version="1.0" encoding="Windows-1251"?><root><region></region><paydeskid>5</paydeskid></root>' )
        ,
        ( '<?xml version="1.0" encoding="Windows-1251"?><root><region></region><paydeskid>6</paydeskid></root>' )

declare @x xml = '<?xml version="1.0" encoding="Windows-1251"?><root><region></region><paydeskid>4</paydeskid></root>'

select  somexml.value('(root/paydeskid/text())[1]', 'int')
from    @t
25 окт 12, 08:54    [13372159]     Ответить | Цитировать Сообщить модератору
 Re: вытащить значение из xml  [new]
dolf85
Member

Откуда:
Сообщений: 58
а такой вопрос, там много записей и они все различаются, могут быть:
<?xml version="1.0" encoding="Windows-1251"?><root><city>Махачкала</city><region></region><street>ул.</street><building>105</building><contactname></contactname><contacts></contacts><workingtime>круглосуточно</workingtime></root>
или
<?xml version="1.0" encoding="Windows-1251"?><root><region></region></root>
а может быть вообще NULL, я поэтому и пытаюсь засунуть селектом любые записи
declare @t table ( somexml xml )
insert into @t
( somexml )
values (select ExtraInfo from Terminals where TerminalID=4)
а уже потом выбирать по тегу select @x.value('(root/paydeskid/text())[1]','int'), подскажите, как правильно будет?
25 окт 12, 12:49    [13373707]     Ответить | Цитировать Сообщить модератору
 Re: вытащить значение из xml  [new]
dolf85
Member

Откуда:
Сообщений: 58
Никто не может помочь, как правильно вставить данные в xml
DECLARE @xVar XML
INSERT @xVar
(select s.ExtraInfo from Subdealers s inner join Terminals t ON t.SubdealerID = s.SubdealerId
where t.TerminalID in (4) and s.ExtraInfo)
26 окт 12, 13:43    [13380096]     Ответить | Цитировать Сообщить модератору
 Re: вытащить значение из xml  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
dolf85,

+ пример формирование xml по данным из таблицы

declare @xml xml
declare @t table
  (
    somedata varchar(50)
  , somedata1 int
  )
insert  into @t
        ( somedata, somedata1 )
values  ( 'aa11111', 1 )
,       ( 'dddf222221', 2 )
,       ( 'ffgg33333', 3 )
,       ( '1axczass', 4 )

set @xml = ( select *
             from   @t
           for
             xml path('data')
               , root('ROOT')
               , type
           )
            
select  @xml

26 окт 12, 15:31    [13380996]     Ответить | Цитировать Сообщить модератору
 Re: вытащить значение из xml  [new]
dolf85
Member

Откуда:
Сообщений: 58
спасибо, более менее разобрался, но еще вопрос возник, просто вывод данный на запрос select s.extrainfo from Subdealers s inner join Terminals t on s.SubdealerId = t.SubdealerID where t.TerminalID=4
29 окт 12, 11:00    [13389237]     Ответить | Цитировать Сообщить модератору
 Re: вытащить значение из xml  [new]
dolf85
Member

Откуда:
Сообщений: 58
просто вывод данных на запрос select s.extrainfo from Subdealers s inner join Terminals t on s.SubdealerId = t.SubdealerID where t.TerminalID=4 будет:
<?xml version="1.0" encoding="Windows-1251"?><root><kp_login>cdt_kp-terminal</kp_login></root>
когда же пытаюсь вытащить в xml
declare @xml xml
set @xml = ( select s.extrainfo from Subdealers s inner join Terminals t on s.SubdealerId = t.SubdealerID where t.TerminalID=4 for xml auto, type )
select @xml
то выводится:
<s extrainfo="<?xml version="1.0" encoding="Windows-1251"?><root><kp_login>cdt_kp-terminal</kp_login></root>" />
можете подсказать почему символы <> заменяются на ; ?
29 окт 12, 11:03    [13389248]     Ответить | Цитировать Сообщить модератору
 Re: вытащить значение из xml  [new]
dolf85
Member

Откуда:
Сообщений: 58
в последнем сообщении отображается как
<s extrainfo="<?xml version="1.0" encoding="Windows-1251"?><root><kp_login>cdt_kp-terminal</kp_login></root>" />
тут это форматируется и отображается верно, на приложенной картинки отображается как есть

К сообщению приложен файл. Размер - 15Kb
29 окт 12, 15:57    [13391922]     Ответить | Цитировать Сообщить модератору
 Re: вытащить значение из xml  [new]
Glory
Member

Откуда:
Сообщений: 104751
dolf85
можете подсказать почему символы <> заменяются на ; ?

Потому что внутри тэга нельзя сдеолать еще тэг

Если вы хотите в типу xml прикрутить <?xml version="1.0" encoding="Windows-1251"?>, то у вас ничего не получится
29 окт 12, 17:00    [13392402]     Ответить | Цитировать Сообщить модератору
 Re: вытащить значение из xml  [new]
dolf85
Member

Откуда:
Сообщений: 58
так получается я не смогу сделать общий тег, в который засуну xml, а тогда не подскажите как лучше мне вытащить значение тега <kp_login>cdt_kp-terminal</kp_login>?
может тогда лучше вообще обойтись без xml, типа substring? но просто там нужно указывать конкретный символ и длину, а у меня это всё разные величины могут быть, поэтому я хотел как мне предложили через xml.value где можно указать конкретный тег
29 окт 12, 17:09    [13392445]     Ответить | Цитировать Сообщить модератору
 Re: вытащить значение из xml  [new]
Glory
Member

Откуда:
Сообщений: 104751
dolf85
так получается я не смогу сделать общий тег

<?xml version="1.0" encoding="Windows-1251"?> - это вообще то не тэг
Зачем он вам вообще в типе xml ?
29 окт 12, 17:11    [13392461]     Ответить | Цитировать Сообщить модератору
 Re: вытащить значение из xml  [new]
dolf85
Member

Откуда:
Сообщений: 58
я знаю что это определение xml, просто мне нужно как-то вытащить значение внутри тега <kp_login>cdt_kp-terminal</kp_login>, но строки могут быть разными:
<?xml version="1.0" encoding="Windows-1251"?><root><kp_login>koper</kp_login></root>
<?xml version="1.0" encoding="Windows-1251"?><root><kp_login>cdt_kp-terminal</kp_login></root>
<?xml version="1.0" encoding="Windows-1251"?><root><lowcity>Екатеринбург</lowcity><contacts>------</contacts><director>.....</director></root>
поэтому незнаю каким решением мне вытаскивать значения, которые внутри <kp_login></kp_login>
29 окт 12, 17:20    [13392525]     Ответить | Цитировать Сообщить модератору
 Re: вытащить значение из xml  [new]
Glory
Member

Откуда:
Сообщений: 104751
dolf85
поэтому незнаю каким решением мне вытаскивать значения, которые внутри <kp_login></kp_login>

Так, как уже показали

Только причем здесь select s.extrainfo from Subdealers s inner join Terminals t on s.SubdealerId = t.SubdealerID where t.TerminalID=4 for xml auto, type ?
Это запрос для создания xml, а не для извлечения из xml данных
29 окт 12, 17:23    [13392542]     Ответить | Цитировать Сообщить модератору
 Re: вытащить значение из xml  [new]
dolf85
Member

Откуда:
Сообщений: 58
что-то я совсем запутался или не могу толком объяснить, у меня данные хранятся в табличке Subdealers, вот этим запросом получаю столбец из которого мне нужно вытащить значение поля <kp_login></kp_login>
select s.extrainfo from Subdealers s inner join Terminals t on s.SubdealerId = t.SubdealerID where t.TerminalID=4
получаю
<?xml version="1.0" encoding="Windows-1251"?><root><kp_login>cdt_kp-terminal</kp_login></root>
мне посоветовали метод value, чтобы вытащить значение, но метод value можно ведь применить только xml, поэтому я и пытался из свои полученные данные преобразовать в xml, а потом уже вытаскивать значение
29 окт 12, 17:30    [13392580]     Ответить | Цитировать Сообщить модератору
 Re: вытащить значение из xml  [new]
Glory
Member

Откуда:
Сообщений: 104751
dolf85
но метод value можно ведь применить только xml, поэтому я и пытался из свои полученные данные преобразовать в xml, а потом уже вытаскивать значение

Для преобразование строки в xml не нужно делать select for xml
Нужно всего лишь конвертировать один тип данных в другой с помощью функции CAST
29 окт 12, 17:46    [13392696]     Ответить | Цитировать Сообщить модератору
 Re: вытащить значение из xml  [new]
dolf85
Member

Откуда:
Сообщений: 58
а можете подсказать правильно ли я понял и в том ли направлении мыслю:
создам временную xml, туда внесу нужные данные в формате xml и потом буду использовать xml.value?
declare @xml xml
set @xml = cast(select s.extrainfo from Subdealers s inner join Terminals t on s.SubdealerId = t.SubdealerID where t.TerminalID=4 as xml)
select @xml.value('(root/kp_login/text())[1]', 'int')
только вот не могу понять как во временную xml правильно вставить мои данные(set @xml = cast(select s.extrainfo from Subdealers s inner join Terminals t on s.SubdealerId = t.SubdealerID where t.TerminalID=4 as xml))
30 окт 12, 16:58    [13398342]     Ответить | Цитировать Сообщить модератору
 Re: вытащить значение из xml  [new]
Glory
Member

Откуда:
Сообщений: 104751
фейспалм какой-то. Не читатель.


declare @t table ( somestring varchar(max) )
insert  into @t
        ( somestring )
values  ( '<?xml version="1.0" encoding="Windows-1251"?><root><region></region><paydeskid>4</paydeskid></root>' )
        ,
        ( '<?xml version="1.0" encoding="Windows-1251"?><root><region></region><paydeskid>5</paydeskid></root>' )
        ,
        ( '<?xml version="1.0" encoding="Windows-1251"?><root><region></region><paydeskid>6</paydeskid></root>' )

select  somexml.value('(root/paydeskid/text())[1]', 'int')
from    (
select somestring, CAST(somestring as xml) as somexml from @t
) a
30 окт 12, 17:00    [13398364]     Ответить | Цитировать Сообщить модератору
 Re: вытащить значение из xml  [new]
dolf85
Member

Откуда:
Сообщений: 58
извините, но тут ведь явное идет указание, что все xml будут строго одинаковые:
declare @t table ( somestring varchar(max) )
insert into @t
( somestring )
values ( '<?xml version="1.0" encoding="Windows-1251"?><root><region></region><paydeskid>4</paydeskid></root>' )
,
( '<?xml version="1.0" encoding="Windows-1251"?><root><region></region><paydeskid>5</paydeskid></root>' )
,
( '<?xml version="1.0" encoding="Windows-1251"?><root><region></region><paydeskid>6</paydeskid></root>' )

а мне нужно вставить любые данные, которые вернет мне запрос select s.extrainfo from Subdealers s inner join Terminals t on s.SubdealerId = t.SubdealerID where t.TerminalID=4 и данные могу быть разные:
<?xml version="1.0" encoding="Windows-1251"?><root><city>Махачкала</city><region></region><street>ул.</street><building>105</building><contactname></contactname><contacts></contacts><workingtime>круглосуточно</workingtime></root>
или
<?xml version="1.0" encoding="Windows-1251"?><root><region></region></root>
или может вообще быть NULL
30 окт 12, 17:08    [13398430]     Ответить | Цитировать Сообщить модератору
 Re: вытащить значение из xml  [new]
Glory
Member

Откуда:
Сообщений: 104751
dolf85
а мне нужно вставить любые данные, которые вернет мне запрос select s.extrainfo from Subdealers s inner join Terminals t on s.SubdealerId = t.SubdealerID where t.TerminalID=4 и данные могу быть разные:

И что вам мешает вместо @t использовать свою таблицу или запрос ?
30 окт 12, 17:09    [13398443]     Ответить | Цитировать Сообщить модератору
 Re: вытащить значение из xml  [new]
dolf85
Member

Откуда:
Сообщений: 58
пытаюсь вот так
declare @t table (somestring varchar(150))
insert @t 
 select s.extrainfo from Subdealers s inner join Terminals t on s.SubdealerId = t.SubdealerID where t.TerminalID=4
select * from @t
select  somexml.value('(root/kp_login/text())[1]', 'int') from (select somestring, CAST(somestring as xml) as somexml from @t)

не получается, не могли бы пояснить последнюю выборку
select  somexml.value('(root/paydeskid/text())[1]', 'int')
from    (
select somestring, CAST(somestring as xml) as somexml from @t
)
30 окт 12, 17:51    [13398757]     Ответить | Цитировать Сообщить модератору
 Re: вытащить значение из xml  [new]
Glory
Member

Откуда:
Сообщений: 104751
dolf85
не получается,

Очень информативно.
Попробуйте что-нибудь, чтобы получилось

dolf85
не могли бы пояснить последнюю выборку

Установить хелп или прочитать онлайн не судьба ?
30 окт 12, 17:54    [13398775]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить