Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 XML, UPDATE, Modify()  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Как обновить данные в XML NULL столбец?
+ Код
USE tempdb
GO
CREATE XML SCHEMA COLLECTION [dbo].[Events] AS N'
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:E="/Event" targetNamespace="/Event" elementFormDefault="qualified">
 <xsd:element name="Events" type="E:Events"/>
 <xsd:complexType name="Events">
  <xsd:sequence>
   <xsd:element name="Event" type="E:Event" maxOccurs="unbounded"/>
  </xsd:sequence>
 </xsd:complexType>
 <xsd:complexType name="Event">
  <xsd:simpleContent>
   <xsd:extension base="E:Text">
    <xsd:attribute name="DateTime" type="xsd:dateTime" use="required" />
   </xsd:extension>
  </xsd:simpleContent>
 </xsd:complexType>
 <xsd:simpleType name="Text">
  <xsd:restriction base="xsd:string">
   <xsd:minLength value="1"/>
  </xsd:restriction>
 </xsd:simpleType>
</xsd:schema>'
GO
CREATE TABLE [dbo].[XMLTable] (
	 [ID]	Int				IDENTITY
	 CONSTRAINT [PK_XMLTable] PRIMARY KEY
	,[Data]	XML (DOCUMENT [dbo].[Events])	NULL
)
GO
INSERT	dbo.XMLTable ([Data])
VALUES	(NULL),('<Events xmlns="/Event"><Event DateTime="2011-11-18T16:36:00Z">Text</Event></Events>')
SELECT * FROM dbo.XMLTable
GO
DECLARE	 @Now	DateTime = GetDate()
	,@Event	NVarChar(max) = 'Event'
--------------------------------------------------------
;WITH XMLNAMESPACES(Default '/Event')
UPDATE	dbo.XMLTable
SET	Data.modify('insert
element Event {
	 attribute DateTime	{ sql:variable("@Now") }
	,text			{ sql:variable("@Event") }
} as last into /Events')
--------------------------------------------------------
GO
SELECT * FROM dbo.XMLTable
DROP TABLE [dbo].[XMLTable]
DROP XML SCHEMA COLLECTION [dbo].[Events]
Msg 5302, Level 16, State 1, Line 4
Невозможно обращение к мутатору "modify()" на "Data" при значении NULL.

Упрощённый код:
DECLARE	@XMLTable  TABLE (
	 [ID]	Int IDENTITY PRIMARY KEY
	,[Data]	XML NULL
)INSERT	@XMLTable ([Data])
VALUES	(NULL),('<Event>Text</Event>')

UPDATE	@XMLTable
SET	Data.modify('insert <Event>Text of new event</Event> as last into /')
CASE и modify() несовместимы.
16 ноя 11, 19:05    [11608747]     Ответить | Цитировать Сообщить модератору
 Re: XML, UPDATE, Modify()  [new]
ura
Member [заблокирован]

Откуда: Киев
Сообщений: 932
UPDATE @XMLTable SET Data=''
where Data is NULL

UPDATE @XMLTable SET Data.modify('insert <Event>Text of new event</Event> as last into /')
16 ноя 11, 19:26    [11608830]     Ответить | Цитировать Сообщить модератору
 Re: XML, UPDATE, Modify()  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
ura, сразу две ошибки:
1. Две команды, частный случай. Не всегда впихнёшь, в общем случае. Т.е. это проигрыш, обход проблемы, костыль. И это не ответ, у меня и так уже есть несколько вариантов костылей.

2. Не всегда можно дописать условие IS NULL:
WHERE CURRENT OF myCursor AND Data IS NULL;
Msg 156, Level 15, State 1, Procedure spProcess, Line L
Неправильный синтаксис около ключевого слова "AND".
Нужно CASE писать палюбэ.

3. И в добавок если вы бы не читали между строк, то будет ошибка для 1-го UPDATE:
Msg 6901, Level 16, State 2, Line 1
Проверка XML: экземпляр XML должен быть документом.
Смотрите определение колонки: [Data] XML (DOCUMENT [dbo].[Events]) NULL
----------

Вообщето пробелема именно в том что CASE и modify() несовместимы и это глупость. Т.к. нужно не только для модификации данных, но и для простого SELECT. Сколько было тем про это.

В итоге в 90% случаев получается кострукция с query() с переопределением содержимого.

Согласны что надо дополнить синтаксис query() из modify() или равномощным ?
Проголосовали бы за это ?
16 ноя 11, 20:29    [11609031]     Ответить | Цитировать Сообщить модератору
 Re: XML, UPDATE, Modify()  [new]
ura
Member [заблокирован]

Откуда: Киев
Сообщений: 932
ошибки, говорите... да я всего лишь показал вам, что modify можно применять к пустой строке.
Mnior
1. Две команды, частный случай.

две команды, одна команда... это проблема клиента, который подсчитывает количество команд в своём батче

Mnior
2. Не всегда можно дописать условие IS NULL:
WHERE CURRENT OF myCursor AND Data IS NULL;

это условие можно дописать в объявление курсора, если он так уж необходим

Mnior
3. И в добавок если вы бы не читали между строк, то будет ошибка для 1-го UPDATE:
Msg 6901, Level 16, State 2, Line 1
Проверка XML: экземпляр XML должен быть документом.
Смотрите определение колонки: [Data] XML (DOCUMENT [dbo].[Events]) NULL

И в добавок, я не между строк читал, а то что вы привели в "упрощённом коде", уж простите мне мою лень и занятость
18 ноя 11, 11:32    [11618843]     Ответить | Цитировать Сообщить модератору
 Re: XML, UPDATE, Modify()  [new]
mike909
Member

Откуда:
Сообщений: 662
Mnior
Согласны что надо дополнить синтаксис query() из modify() или равномощным ?
Проголосовали бы за это ?

Да - обееми руками !!!
Особенно за возможность такого:
declare @t table( val xml )
insert into @t values('<Root />')

update t set val.modify('insert sql:column("n.p") into /Root[1]')
from @t as t
cross apply(
  select cast('<Params QQ="QQ" />' as xml) as [p]
) as n

18 ноя 11, 12:43    [11619652]     Ответить | Цитировать Сообщить модератору
 Re: XML, UPDATE, Modify()  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
До когото медленно доходит.
+ для ura
ura
ошибки, говорите... да я всего лишь показал вам, что modify можно применять к пустой строке.
Бардак в голове. Предупрежу сразу, я придираюсь ко всему, такой уж.

1. Не такого как "пустая строка", есть XML фрагмент с пустым количесвом элементов. А если указано, что допустим только DOCUMENT, то это ошибка.
2. То что методы работают для не NULL объектов ... вы не KO случайно? Здравствуйте коллега.

ura
две команды, одна команда... это проблема клиента, который подсчитывает количество команд в своём батче.
Не глубоко копнули. Но даже если только остановииться на ней, то родной продукт MS как SqlDataAdapter пролетает как фанера. В данном случае вы проблему, перенесли на другой уровень. Точнее один костыль порождает ещё сотни.
Контролить надо не только клиенту но и в процедурах (@@RowCount и т.п.), представте на сколько увеличится проверка. А ещё надо скопировать и WHERE, представте что он сложный. А ещё надо делать modify() не для всех строк, в отличие от других колонок.

ura
это условие можно дописать в объявление курсора, если он так уж необходим
Вообще бред. Вы вообще можете подумать о проблеме, а не отвечать на каждое предложение независимо от всей задачи и контекста. Если бегая по курсору надо изменить XML, который может быть NULL. И вы предлагаете изменть задучу (обходить не NULL), но не решить её.

Из всех вариантов вы выбрали неправильный. Троллите?

ura
И в добавок, я не между строк читал, а то что вы привели в "упрощённом коде", уж простите мне мою лень и занятость
А смысл тратить время на ответы не на те вопросы?! Нет времени разобраться - не отвечай, съэкономь себе и другим. Из-за такого эгоистического подхода - непростительно.


mike909
Особенно за возможность такого:
declare @t table( val xml ); insert @t values('<Root />');

update t set val.modify('insert sql:column("n.p") into /Root[1]')
from @t as t cross apply(select cast('<Params QQ="QQ" />' as xml) as [p]) as n

select * from @t
val
<Root><Params QQ="QQ" /></Root>
Эээ, не понял.
Не представляю как эту работающую конструкцию можно упростить.

Может вы имели ввиду это?:
DECLARE	@Table TABLE (
	 ID	Int IDENTITY PRIMARY KEY
	,Data	XML
)INSERT	@Table
VALUES	('<Root/>')	-- Сложный XML

SELECT	 ID
	,Data.modify('insert attribute ID { sql:column("ID") } into /Root[1]')
--	,Data.query ('insert attribute ID { sql:column("ID") } into /Root[1]')
FROM	@Table
Ok. Поставлю запрос о очередь.

Метод merge().
А можно ли расширять текущий функционал системных типов? Или только унаследоваться и написать свой с блекдж дополненной функцией ?
У кого-то был опыт ? Блин, это сложно, надо генератор кода писать, всё никак руки не доходят.
18 ноя 11, 14:28    [11620840]     Ответить | Цитировать Сообщить модератору
 Re: XML, UPDATE, Modify()  [new]
ura
Member [заблокирован]

Откуда: Киев
Сообщений: 932
Mnior
...До когото медленно доходит... Бардак в голове....KO...Троллите...эгоистического подход

Ба, да вы просто образец толерантности. Можно подумать, это не я вам одолжение делаю, а вы мне - тем, что дали возможность ответить на свой вопрос. Пусть это и "костыль", как вы выразились, но было не очень умно ожидать в этом топике того, что microsoft пойдёт вам на встречу и изменит свой синтаксис
18 ноя 11, 15:12    [11621301]     Ответить | Цитировать Сообщить модератору
 Re: XML, UPDATE, Modify()  [new]
mike909
Member

Откуда:
Сообщений: 662
Mnior
mike909
+ сократим для читабельности

Особенно за возможность такого:
declare @t table( val xml ); insert @t values('<Root />');

update t set val.modify('insert sql:column("n.p") into /Root[1]')
from @t as t cross apply(select cast('<Params QQ="QQ" />' as xml) as [p]) as n

select * from @t
val
<Root><Params QQ="QQ" /></Root>

Эээ, не понял.
Не представляю как эту работающую конструкцию можно упростить.

К сожалению на SQL2k5 не работает.
А вот на SQL2k8 - сработало
Mnior
+ Может вы имели ввиду это?:

DECLARE	@Table TABLE (
	 ID	Int IDENTITY PRIMARY KEY
	,Data	XML
)INSERT	@Table
VALUES	('<Root/>')	-- Сложный XML

SELECT	 ID
	,Data.modify('insert attribute ID { sql:column("ID") } into /Root[1]')
--	,Data.query ('insert attribute ID { sql:column("ID") } into /Root[1]')
FROM	@Table
Ok. Поставлю запрос о очередь.

Метод merge().
А можно ли расширять текущий функционал системных типов? Или только унаследоваться и написать свой с блекдж дополненной функцией ?
У кого-то был опыт ? Блин, это сложно, надо генератор кода писать, всё никак руки не доходят.

Не совсем понял - Вы про мой "опыт" ?
+ Ну так он у меня не такой и большой.
Да и тот, что был года два назад потихоньку улетучивается с переходом на административную работу
18 ноя 11, 15:53    [11621730]     Ответить | Цитировать Сообщить модератору
 Re: XML, UPDATE, Modify()  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
mike909
Не совсем понял - Вы про мой "опыт" ?
Ко всем обращался.

ura
Можно подумать, это не я вам одолжение делаю, а вы мне - тем, что дали возможность ответить на свой вопрос.
Одолжение? Верх адекватности.
Вы зафлудили, "ответив" фиг знает на что, неразобравшись. Это факт. И только на этот факт и был вам ответ. На то что вы присоединились к обсуждению общей проблемы, спасибо. (а не предоставление "помощи", опомнитесь)

ura
было не очень умно ожидать в этом топике того, что microsoft пойдёт вам на встречу и изменит свой синтаксис
Эээ, вы надумываете на меня, что я что-то ожидаю от MS, а потом в этом обвиняете?!

Тут происходит обсуждение (попытка), и только после всестороннего высказывания мнений и аргументов может быть выдвинуто решение о подаче запроса на connection.
Это не говоря, что всё это эфемерно, синтаксис и концепцию надо ещё и разработать.
Вот скажите, вы сразу заметили, что modify() может делать только одну простую команду? А задумывались почему?

ura, не надо зажимать форум (и всех присутстсвующих) в рамки ващего представления, словно тут соревнования кто быстрее запостит ответ, или словно все встают в очередь к вашему снисходждению и ответу, на любой вопрос.
И кстати, к вашему сведению, работники MS тут иногда ошиваются.
18 ноя 11, 17:11    [11622326]     Ответить | Цитировать Сообщить модератору
 Re: XML, UPDATE, Modify()  [new]
ura
Member [заблокирован]

Откуда: Киев
Сообщений: 932
Mnior
Вы зафлудили, "ответив" фиг знает на что, неразобравшись

Вопрос был, цитирую - "Как обновить данные в XML NULL столбец?"
Я дал на него ответ. После чего с вашей стороны пошло сплошное выпячивание своей крутизны. Плюс, кстати, завуалированные наезды в мой адрес. Ну да ладно, не буду дальше мешать вашей "попытке обсуждения"
18 ноя 11, 19:08    [11622871]     Ответить | Цитировать Сообщить модератору
 Re: XML, UPDATE, Modify()  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Что уже есть в conection на данный момент:
  • Mutators should be permitted on NULL objects (но для XML не тянет)
  • Update multiple nodes / values in a XML column (+ 3 похожих запроса)
  • After an XML modify() operation, need a way to know if the operation succeeded or not.

    Мимоходом нарвался
  • suppress namespace attributes in nested SELECT FOR XML statements (Может в Denali уже работает, проверьте плиз)
  • 19 ноя 11, 17:43    [11625185]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить