Форум программистов, компьютерный форум, киберфорум
Наши страницы
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
 
Toros1992
615 / 353 / 197
Регистрация: 26.11.2015
Сообщений: 1,156
Завершенные тесты: 4
1

Update с переменной

18.07.2019, 17:18. Просмотров 270. Ответов 3
Метки нет (Все метки)

Всем привет, подскажите пожалуйста один момент. Есть такой абстрактный запрос:
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CREATE Table #temp (
  c1 int,
  c2 int,
  c3 int
)
INSERT INTO #temp VALUES
(1,1,1),
(2,1,1),
(3,1,1)
 
DECLARE @r int
update #temp
set @r = c1,
     c2 = @r + 1,
     c3 = @r + c2
WHERE c1 = 1
 
SELECT * FROM #temp
Суть его в том, что в запросе UPDATE можно использовать переменные. и он работает. После него такие результаты:
123
211
311
Но вот вопрос, почему не работает такой конкретный запрос?

T-SQL
1
2
3
4
5
6
7
8
9
10
Declare @Data xml
update LegalEvent set
    @Data = cast(REPLACE(cast(Data as varchar(max)),'<?xml version="1.0"?>','<?xml version=''1.0'' encoding=''Utf-8''?>') as xml), 
    XMLEventGround = @Data.value('(//GroundType)[1]', 'varchar(100)'),
    XMLEventType = @Data.value('(//DefineType)[1]', 'varchar(100)'),
    XMLEventTypeDescription = @Data.value('(//DefineTypeDisctib)[1]', 'varchar(1000)'),
    XMLEventGroundDescription = @Data.value('(//GroundTypeDisctib)[1]', 'varchar(1000)'),
    XMLEventResult = @Data.value('(//CourtResult)[1]', 'varchar(100)'),
    XMLEventResultDescription = @Data.value('(//Info)[1]', 'varchar(1000)')
    WHERE Data is not null
В результате его выполнения в обновляемые поля записываются NULL'ы
Помогите понять пожалуйста, в чем проблема

Добавлено через 1 час 5 минут
Дополню, методом тыка выяснилось, что если делать так:
T-SQL
1
2
3
4
5
Declare @Data xml
update LegalEvent set
    @Data = cast(REPLACE(cast(Data as varchar(max)),'<?xml version="1.0"?>','<?xml version=''1.0'' encoding=''Utf-8''?>') as xml), 
   XML_Data = @Data
    WHERE Data is not null
То все сохраняется, почему то результат метода value в таком запросе именно дает NULL
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.07.2019, 17:18
Ответы с готовыми решениями:

Триггер с after update не работает, а с for update работает
Не могу понять, почему так происходит? В нэте пишут, что after/for это the same . Но все же. В...

DataGrid update ПРОБЛЕМА: Key column information is insufficient or incorect. Too many rows were affected by update
Привет всем ! В Вижуал Басик6 на форме имею ДатаГрид с информацией из Аксцессс 2000. Соединение...

Дедлоки между update limit N и update по primary key
Добрый день! Столкнулся с дедлоками, хотелось бы послушать опытных товарищей как с этим быть. ...

Не получается сделать Update (Update requires a valid InsertCommand)
Не получается сделать Update выдаёт ошибку, что делаю не так? В таблице только одно поле, оно...

Ошибка при Update "Update requires a valid InsertCommand when passed DataRow collection with new rows"
Доброго времени суток! Я в этом всем новичек и поэтому совсем не могу понять в чем ошибка. В...

3
invm
2299 / 1517 / 498
Регистрация: 02.06.2013
Сообщений: 3,742
18.07.2019, 18:04 2
Цитата Сообщение от Toros1992 Посмотреть сообщение
Помогите понять пожалуйста, в чем проблема
Потому что берется текущее значение @Data, а не присваемое.

Не нужно мудрить, все гораздо проще:
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
declare @t table (a varchar(100), Data xml);
insert into @t values (null, '<?xml version="1.0"?><GroundType>xxx</GroundType>');
 
select * from @t;
 
update t
 set
  a = s.x.value('(//GroundType)[1]', 'varchar(100)')
from
 @t t cross apply
 (select cast(REPLACE(cast(Data as varchar(max)),'<?xml version="1.0"?>','<?xml version="1.0" encoding="Utf-8"?>') as xml)) s(x);
 
select * from @t;
ЗЫ: MSSQL не поддерживает UTF-8
1
Toros1992
615 / 353 / 197
Регистрация: 26.11.2015
Сообщений: 1,156
Завершенные тесты: 4
18.07.2019, 18:33  [ТС] 3
invm, все равно не очень понятна причина. Если таким образом записывать весь xml то он записывается корректно. Или вы имеете в виду, что вызываемые методы value в момент вызова вызываются от имени пустого объекта?
0
invm
2299 / 1517 / 498
Регистрация: 02.06.2013
Сообщений: 3,742
18.07.2019, 20:18 4
Toros1992, видимо это такая особенность работы xml reader через переменную.
Потому что значение присваивается.
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
declare @x xml;
declare @t table (id int, x xml, id_from_x int null, s varchar(max));
 
insert into @t
 (id, x)
values
 (1, '<id>1</id>'),
 (2, '<id>2</id>');
 
update @t
 set
  @x = x,
  s = cast(@x as varchar(max)),
  id_from_x = @x.value('id[1]', 'int');
 
select * from @t;
1
18.07.2019, 20:18
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.07.2019, 20:18

a,b и c.Присвоить максимальное из них переменной a,минимальное-переменной c,среднее переменной b
даны произвольные числа a,b и c.Присвоить максимальное из них переменной a,минимальное-переменной...

Переменной B присвоить первую десятичную цифру переменной A, а переменной С вторую цифру переменной А
Помогите, у меня есть число A = 16,и переменные B и C. Как переменной B присвоить первую цифру...

Присвоить значение наименьшего элемента массива переменной М1, номер строки, где находится этот элемент, - переменной Т, номер столбца - переменной С
Массив С действительных чисел имеет 5 строк и 11 столбцов. Присвоить значение наименьшего элемента...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru