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

Откуда:
Сообщений: 11
Доброго времени суток

есть две таблицы:
T_c_d(number float, numberBankomat float, date date, amount float, isInkassator int)
T(productID int, history xml)

по insert-у в первую таблицу должна добавляться запись в xml-атрибут соответствующей строки второй.

На жестко зашитых данных все хорошо:
UPDATE T
	SET history.modify
	(
		'insert <operation>
					<number>2</number>
					<date>12.09.2011</date>
					<actor>1</actor>
					<isInkassator>0</isInkassator>
					<amount>40000</amount>
					<type>1</type>
				</operation> as first
		into ((doc)[1])'
	)
	WHERE productID = 1


Но в строку, которая вставляется в modify, должны каким-то образом подставляться данные вставленные в первую таблицу. И вот тут возникает собственно проблема. Пробовал конкатенировать значения и строку прямо внутри modify:
SET history.modify
	(
		'insert <operation>
					<number>' + 2 + '</number>
					<date>12.09.2011</date>
					<actor>1</actor>
					<isInkassator>0</isInkassator>
					<amount>40000</amount>
					<type>1</type>
				</operation> as first
		into ((doc)[1])'
	)


пробовал сделать предварительно переменную и уже ее подставлять:
DECLARE @myString varchar(max)
SET @myString = 'insert <operation>
					<number>' + 2 + '</number>
					<date>12.09.2011</date>
					<actor>1</actor>
					<isInkassator>0</isInkassator>
					<amount>40000</amount>
					<type>1</type>
				</operation> as first
		into ((doc)[1])'

UPDATE T
	SET history.modify
	(
		@myString
	)
	WHERE productID = 1


в обоих случаях ошибка:
"The argument 1 of the XML data type method "modify" must be a string literal"
чем отличается и как привести varchar к этому string literal понять не смог.

Подскажите, пожалуйста, как сделать. Если кто-нибудь напишет весь триггер целиком, то буду безумно благодарен, т.к. с T-SQL и MS SQL Server не очень много приходилось работать
13 дек 11, 04:45    [11753974]     Ответить | Цитировать Сообщить модератору
 Re: триггер изменяющий XML  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5124
курите sql:variable
13 дек 11, 09:46    [11754308]     Ответить | Цитировать Сообщить модератору
 Re: триггер изменяющий XML  [new]
mike909
Member

Откуда:
Сообщений: 662
burashka,
Судя по типу [date] у вас SQL2k8
Тогда:
declare @t table(productID int, history xml)
declare @Inserted table(number float, numberBankomat float, [date] date, amount float, isInkassator int)

insert into @t
select 1, 
'<doc>
  <operation>
    <number>999.000000000000000e+000</number>
    <date>2010-01-01</date>
    <actor>0</actor>
    <isInkassator>0</isInkassator>
    <amount>999.000000000000000e+000</amount>
    <type>0</type>
  </operation>
</doc>'

insert into @Inserted
select 1.0, 1.0, dateadd(minute, -1, GetDate()), 1.0, 1 union all
select 2.0, 2.0, dateadd(minute, -2, GetDate()), 2.0, 2 union all
select 3.0, 3.0, dateadd(minute, -3, GetDate()), 3.0, 3 union all
select 4.0, 4.0, dateadd(minute, -4, GetDate()), 4.0, 4

update t set history.modify( 'insert sql:column("n.NewData") as first into /doc[1]' )
FROM @t as  t
CROSS APPLY(
  SELECT (
    SELECT 
      number 
	    ,date
      ,1 as [actor]
	    ,isInkassator
      ,amount  
      ,1 as [type]
    FROM @Inserted 
    FOR XML PATH('operation'), type
  ) as [NewData]
) as n
WHERE productID = 1

select *
from @t

Пойдет ?
13 дек 11, 11:13    [11754824]     Ответить | Цитировать Сообщить модератору
 Re: триггер изменяющий XML  [new]
burashka
Member

Откуда:
Сообщений: 11
mike909, да, спасибо большое!)
13 дек 11, 21:26    [11760258]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить