Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/21: Рейтинг темы: голосов - 21, средняя оценка - 4.71
899 / 554 / 275
Регистрация: 26.11.2015
Сообщений: 1,758
Записей в блоге: 2
1

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

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

Author24 — интернет-сервис помощи студентам
Всем привет, подскажите пожалуйста один момент. Есть такой абстрактный запрос:
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.07.2019, 17:18
Ответы с готовыми решениями:

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
3499 / 2083 / 742
Регистрация: 02.06.2013
Сообщений: 5,078
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
899 / 554 / 275
Регистрация: 26.11.2015
Сообщений: 1,758
Записей в блоге: 2
18.07.2019, 18:33  [ТС] 3
invm, все равно не очень понятна причина. Если таким образом записывать весь xml то он записывается корректно. Или вы имеете в виду, что вызываемые методы value в момент вызова вызываются от имени пустого объекта?
0
3499 / 2083 / 742
Регистрация: 02.06.2013
Сообщений: 5,078
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.07.2019, 20:18
Помогаю со студенческими работами здесь

Надо вывести название переменной, тип данных переменной, значение переменной
у нас есть переменная int variable = 0; Надо вывести название переменной, тип данных переменной,...

Надо вывести название переменной, тип данных переменной, значение переменной
у нас есть переменная int variable = 0; Надо вывести название переменной, тип данных переменной,...

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

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru