Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Гуру помогите. Чтение значений из xml поля таблицы MSSQL  [new]
wassaw
Member

Откуда:
Сообщений: 8
Гуру помогите.
Суть задачи:
Есть папка с файлами XML - 2344шт., данные файлы загоняются в таблицу MSSQL 2005 TabFile1 командой:
INSERT INTO TabFile(ПолноеИмяФайла,ИмяФайла,ДатаВремя,xmlDOC) SELECT '"+п1+"','"+п2+"','"+п3+"',* FROM OPENROWSET (BULK '"+п1+"',SINGLE_BLOB) as Document;
в цикле через ADODB - всё ОК.
XML поле xmlDOC.
п1,п2,п3 - переменные из 1С77 - не важно.
потом необходимо из TabFile1, выбрать/перегнать кучу значений в таблицу EDIIndex и в том числе из поля XML xmlDOC.
и вот здесь у меня полный ОБЛОМ в мозгах. :-(.
Конечно же, прежде чем задавать вопрос, перелопатил всё что удалось найти:
Использование XML совместно с SQL http://www.rsdn.ru/article/db/xmlsql.xml,
MSDN http://msdn.microsoft.com/ru-ru/library/ms123401.aspx, и.т.д.
всё что смог перепробовал (всё что смог понять :-(). НО! видимо мозгов не хватает. и опыта работы с SQL.
пробовал уже по шажочкам понять:
SELECT xmlDOC.query('/Document/Housekeeping/DateReceived') FROM TabFile1
работает но выдает так же xml поле.
потом пробовал добраться хоть до ОДНОГО значения ДАТА:
SELECT xmlDOC.value(@val,'/Document/Housekeeping/DateReceived') FROM TabFile1;
пусто :-(.
структура 1 шт. xml поля - упрощенная:
после команды:SELECT xmlDOC.query('/Document/Housekeeping') FROM TabFile1

<Housekeeping>
<DateReceived>2013-10-03</DateReceived>
<TimeReceived>04:41:44</TimeReceived>
<partner-iln>ХХХХХХХХХХХХХХ</partner-iln>
<DocumentDate>2013-10-02</DocumentDate>
<document-type>DESADV</document-type>
<document-version>ECODRU2</document-version>
<direction>OUT</direction>
<GLN>ХХХХХХХХХХХХХХ</GLN>
<Dok>{"O","0","0","410","0","0"," 4538888003"}</Dok>
<relation-id>155441</relation-id>
<DateOpening>2013-10-02</DateOpening>
<TimeOpening>11:55:06</TimeOpening>
<CoupledDocument Type="Order">
<FileName>\IN\ORDER_196741_20131002114705609.XML</FileName>
</CoupledDocument>
<CurrentIssue>TT-857</CurrentIssue>
</Housekeeping>

мне бы хотябы один принцип понять или реальную выборку ОДНОГО значения из xml поля.
1 ноя 13, 11:24    [15063165]     Ответить | Цитировать Сообщить модератору
 Re: Гуру помогите. Чтение значений из xml поля таблицы MSSQL  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 2843
wassaw
SELECT xmlDOC.value(@val,'/Document/Housekeeping/DateReceived') FROM TabFile1;
пусто :-(.
Ыыы, синтаксис изобретать не надо, потому что.
SELECT xmlDOC.value('/Document/Housekeeping/DateReceived[1]', 'date') FROM TabFile1;
- вы не смогли этого найти в хелпе по методу value()?
1 ноя 13, 11:29    [15063240]     Ответить | Цитировать Сообщить модератору
 Re: Гуру помогите. Чтение значений из xml поля таблицы MSSQL  [new]
wassaw
Member

Откуда:
Сообщений: 8
спасибо Вам за быстрый ответ. не ожидал.
конечно же я пробовал очень много чего - неделю.
value, query из XQuery - примеры
и пробовал OPENXML - примеры
они все через переменные @xxx загоняют xml данные и.т.д потом выбирают (и... я не понял как к таблицам и множественной выборке это привязать - понимаю ламер).
Выш запрос сообщил:
Msg 9500, Level 16, State 1, Line 1
The data type 'date' used in the VALUE method is invalid.
1 ноя 13, 11:42    [15063389]     Ответить | Цитировать Сообщить модератору
 Re: Гуру помогите. Чтение значений из xml поля таблицы MSSQL  [new]
Гость333
Member

Откуда:
Сообщений: 3684
wassaw
Выш запрос сообщил:
Msg 9500, Level 16, State 1, Line 1
The data type 'date' used in the VALUE method is invalid.

Значит, у вас MSSQL 2005, о чём вы почему-то не сочли нужным сообщить. Замените date на datetime.
1 ноя 13, 11:45    [15063418]     Ответить | Цитировать Сообщить модератору
 Re: Гуру помогите. Чтение значений из xml поля таблицы MSSQL  [new]
wassaw
Member

Откуда:
Сообщений: 8
Гость333 спасибо. пробую.
кстати из TS 'данные файлы загоняются в таблицу MSSQL 2005 TabFile1 командой:' - вроде однозначно MSSQL 2005.
запрос:
SELECT xmlDOC.value('/Document/Housekeeping/DateReceived[1]', 'datetime') FROM TabFile1;
ответ:
Msg 2389, Level 16, State 1, Line 1
XQuery [TabFile1.xmlDOC.value()]: 'value()' requires a singleton (or empty sequence), found operand of type 'xdt:untypedAtomic *'
1 ноя 13, 11:54    [15063500]     Ответить | Цитировать Сообщить модератору
 Re: Гуру помогите. Чтение значений из xml поля таблицы MSSQL  [new]
Glory
Member

Откуда:
Сообщений: 104764
wassaw
кстати из TS 'данные файлы загоняются в таблицу MSSQL 2005 TabFile1 командой:' - вроде однозначно MSSQL 2005.

Это однозначно > 2000, а не == 2005
1 ноя 13, 11:56    [15063529]     Ответить | Цитировать Сообщить модератору
 Re: Гуру помогите. Чтение значений из xml поля таблицы MSSQL  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7360
wassaw,
SELECT xmlDOC.value('(/Document/Housekeeping/DateReceived)[1]', 'datetime') FROM TabFile1


дело в том, что Document, Housekeeping и DateReceived в xml, в принципе, может быть несколько, а требуется четко указать, какое именно значение надо получить.
1 ноя 13, 11:58    [15063544]     Ответить | Цитировать Сообщить модератору
 Re: Гуру помогите. Чтение значений из xml поля таблицы MSSQL  [new]
wassaw
Member

Откуда:
Сообщений: 8
Microsoft SQL Server Management Studio 9.00.1399.00
Microsoft Analysis Services Client Tools 2005.090.1399.00
Microsoft Data Access Components (MDAC) 2000.086.3959.00 (srv03_sp2_rtm.070216-1710)
Microsoft MSXML 2.6 3.0 5.0 6.0
Microsoft Internet Explorer 6.0.3790.3959
Microsoft .NET Framework 2.0.50727.42
Operating System 5.2.3790
1 ноя 13, 11:59    [15063552]     Ответить | Цитировать Сообщить модератору
 Re: Гуру помогите. Чтение значений из xml поля таблицы MSSQL  [new]
Glory
Member

Откуда:
Сообщений: 104764
wassaw
Microsoft SQL Server Management Studio 9.00.1399.00

Это Management Studio
Версия сервера получается из выполнения select @@version
1 ноя 13, 12:00    [15063565]     Ответить | Цитировать Сообщить модератору
 Re: Гуру помогите. Чтение значений из xml поля таблицы MSSQL  [new]
Гость333
Member

Откуда:
Сообщений: 3684
Гость333
Значит, у вас MSSQL 2005, о чём вы почему-то не сочли нужным сообщить.

wassaw
данные файлы загоняются в таблицу MSSQL 2005

Сообщил, я был невнимателен, извиняюсь.
1 ноя 13, 12:07    [15063663]     Ответить | Цитировать Сообщить модератору
 Re: Гуру помогите. Чтение значений из xml поля таблицы MSSQL  [new]
wassaw
Member

Откуда:
Сообщений: 8
Glory.
Microsoft SQL Server 2005 - 9.00.1399.06 (X64) Oct 14 2005 00:35:21 Copyright (c) 1988-2005 Microsoft Corporation Developer Edition (64-bit) on Windows NT 5.2 (Build 3790: Service Pack 2).
--------------------------
так же пробую упростить себе задачу для понимания:
SELECT xmlDOC.query('/Document/Housekeeping/DateReceived') as HHH FROM TabFile1
выдает xml поля типо:
<DateReceived>2013-10-03</DateReceived>
попробую создать таблицу TabFile и загнать туда ТОЛЬКО (2344 row(s) affected) типа xml <DateReceived>ХХХХ-ХХ-ХХ</DateReceived>
и попробую тогда:
SELECT xmlDOC.value('/DateReceived[1]', 'datetime') FROM TabFile;
может что нибудь пойму :-(
1 ноя 13, 12:23    [15063843]     Ответить | Цитировать Сообщить модератору
 Re: Гуру помогите. Чтение значений из xml поля таблицы MSSQL  [new]
wassaw
Member

Откуда:
Сообщений: 8
ВСЕМ ОГРОМНОЕ СПАСИБО!!!
-----------------------------
сделал отдельную таблицу как и писал TabFile.
перелил в неё из TabFile1 только xml поле по запросу : INSERT ом
SELECT xmlDOC.query('/Document/Housekeeping/DateReceived') FROM TabFile1;
и попробовал:
SELECT xmlDOC.value('/DateReceived[1]', 'datetime') FROM TabFile;
получил:
2013-10-03 00:00:00.000
2013-10-01 00:00:00.000
.............
и.т.д
-------------------------------
всё можно жить и работать дальше и умнеть :-)
не обижайтесь за ламерские вопросы. не со зла я.
ВСЕМ ОГРОМНОЕ СПАСИБО ЗА ОТЗЫВЧИВОСТЬ И ТЕРПЕНИЕ.!!!!
1 ноя 13, 12:46    [15064058]     Ответить | Цитировать Сообщить модератору
 Re: Гуру помогите. Чтение значений из xml поля таблицы MSSQL  [new]
Glory
Member

Откуда:
Сообщений: 104764
wassaw
сделал отдельную таблицу как и писал TabFile.
перелил в неё из TabFile1 только xml поле по запросу : INSERT ом
SELECT xmlDOC.query('/Document/Housekeeping/DateReceived') FROM TabFile1;
и попробовал:
SELECT xmlDOC.value('/DateReceived[1]', 'datetime') FROM TabFile;
получил:
2013-10-03 00:00:00.000
2013-10-01 00:00:00.000
.............
и.т.д
-------------------------------
всё можно жить и работать дальше и умнеть :-)

Откройте для себя outer apply join
1 ноя 13, 12:50    [15064081]     Ответить | Цитировать Сообщить модератору
 Re: Гуру помогите. Чтение значений из xml поля таблицы MSSQL  [new]
Гость333
Member

Откуда:
Сообщений: 3684
wassaw
Microsoft SQL Server 2005 - 9.00.1399.06 (X64) Oct 14 2005 00:35:21

Сервис-паки не мешало бы накатить, а то версия зело древняя (RTM), Service Pack 4 уже три года как выпущен.
1 ноя 13, 12:53    [15064118]     Ответить | Цитировать Сообщить модератору
 Re: Гуру помогите. Чтение значений из xml поля таблицы MSSQL  [new]
wassaw
Member

Откуда:
Сообщений: 8
Glory.
я программист 1С7.7 1С8.2 - по отзывам других - вроде не плохой :-).
конечно же мы сталкиваемся с запросами SQL но! опосредованно через транслятор 1С (что не есть чистый TSQL - конечно-же)
а его бледное отражение.
Задачу дало начальство - решить необходимо (это EDI адаптация).
всё что мог из 1С выжал НО! медленно (причем хоть 1С77 хоть 1С82) - очень много XML файлов и будет больше.
выход ТОЛЬКО ПРЯМАЯ РАБОТА с MSSQL.
уже получил разницу в парсинге и создании так называемых индексных таблиц EDI (это не чистые индексы в SQL понимании).
1С(обработки не я писал - трогать - нельзя)- 30 минут (50 362 файла xml)
MSSQL TSQL (можно с нуля самому написать) - 18 секунд (50 362 файла xml)
думаю победить и полюбить SQL в чистом виде (хотя понимаю - хлопотно это) :-)
1 ноя 13, 13:04    [15064213]     Ответить | Цитировать Сообщить модератору
 Re: Гуру помогите. Чтение значений из xml поля таблицы MSSQL  [new]
wassaw
Member

Откуда:
Сообщений: 8
Гость333 . спасибо за совет.
передам сис.админу - это его вотчина :-).

ЕЩЁ РАЗ ВСЕМ ОГРОМНОЕ СПАСИБО! (особливо что не послали ...... к мануалам).
1 ноя 13, 13:33    [15064495]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Гуру помогите. Чтение значений из xml поля таблицы MSSQL  [new]
xml-вопрос
Guest
Всем привет!
делаю
declare
	@xml xml

set @xml = N'
<root>
<row><f_int>111</f_int><f_nvarchar>test</f_nvarchar><f_xml><sub_string>sub111</sub_string><sub_string>sub111_111</sub_string></f_xml></row>
<row><f_int>222</f_int><f_nvarchar>test222</f_nvarchar><f_xml><sub_string>sub222</sub_string></f_xml></row>
</root>
'

select
	cdr.r.value('f_int[1]', 'int') as [f_int],
	cdr.r.value('f_nvarchar[1]', 'nvarchar(max)') as [f_nvarchar],
	cdr.r.value('f_xml[1]', 'nvarchar(max)') as [f_xml],
--	cdr.r.value('f_xml[1]', 'xml') as [f_xml],
	cdr.r.query('f_xml') as [f_xml]
from @xml.nodes('root/row') as cdr(r)


в итоге получаю
f_int	f_nvarchar	f_xml_nvarchar	f_xml_query
111 test111 sub1sub11 <f_xml><sub_1>sub1</sub_1><sub_11>sub11</sub_11></f_xml>
222 test222 sub2sub33 <f_xml><sub_2>sub2</sub_2><sub_33>sub33</sub_33></f_xml>

подскажите пожалуйста как получить последнее поле в виде
f_xml
<sub_1>sub1</sub_1><sub_11>sub11</sub_11>
<sub_2>sub2</sub_2><sub_33>sub33</sub_33>
19 июн 17, 13:42    [20574528]     Ответить | Цитировать Сообщить модератору
 Re: Гуру помогите. Чтение значений из xml поля таблицы MSSQL  [new]
Cammomile
Member

Откуда:
Сообщений: 830
select REPLACE(REPLACE('<f_xml><sub_1>sub1</sub_1><sub_11>sub11</sub_11></f_xml>', '<f_xml>','' ),'</f_xml>','')
19 июн 17, 13:48    [20574542]     Ответить | Цитировать Сообщить модератору
 Re: Гуру помогите. Чтение значений из xml поля таблицы MSSQL  [new]
xml-вопрос
Guest
Cammomile,
это первое о чем я подумал
но хотелось бы сделать штатными xml-ными средствами
19 июн 17, 13:53    [20574560]     Ответить | Цитировать Сообщить модератору
 Re: Гуру помогите. Чтение значений из xml поля таблицы MSSQL  [new]
invm
Member

Откуда: Москва
Сообщений: 7448
xml-вопрос
подскажите пожалуйста как получить последнее поле в виде
cdr.r.query('f_xml/*') as [f_xml]
19 июн 17, 13:53    [20574561]     Ответить | Цитировать Сообщить модератору
 Re: Гуру помогите. Чтение значений из xml поля таблицы MSSQL  [new]
xml-вопрос
Guest
спасибо большое, получилось!
19 июн 17, 14:00    [20574577]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить