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

Откуда: Msk
Сообщений: 581
есть 1000 строк.

нужно найти строки, где будет ошибка оператора CAST([Content] AS XML) .
"XML parsing: ..."

можно ли это сделать без курсора?
23 авг 18, 17:18    [21652284]     Ответить | Цитировать Сообщить модератору
 Re: try внутри запроса  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36905
try_convert()
23 авг 18, 17:25    [21652288]     Ответить | Цитировать Сообщить модератору
 Re: try внутри запроса  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
попробовал тоже, но похоже он с xml не дружит.

select try_cast('xml?' as xml), try_cast('<xml></xml>' as xml)


                                                           
------------------------- -----------------------------------
xml? <xml />

(1 row affected)
23 авг 18, 17:30    [21652293]     Ответить | Цитировать Сообщить модератору
 Re: try внутри запроса  [new]
NewIvanovec
Member

Откуда: Msk
Сообщений: 581
Гавриленко Сергей Алексеевич
try_convert()

2016 сервер выдает ошибку

'TRY_CONVERT' is not a recognized built-in function name.
23 авг 18, 17:32    [21652294]     Ответить | Цитировать Сообщить модератору
 Re: try внутри запроса  [new]
NewIvanovec
Member

Откуда: Msk
Сообщений: 581
Отлично, try_cast то, что надо
Спасибо большое, господа!
23 авг 18, 17:36    [21652297]     Ответить | Цитировать Сообщить модератору
 Re: try внутри запроса  [new]
aleks222
Member

Откуда:
Сообщений: 923
NewIvanovec
есть 1000 строк.

нужно найти строки, где будет ошибка оператора CAST([Content] AS XML) .
"XML parsing: ..."

можно ли это сделать без курсора?


Лехко.

select top(n)
и метод деления отрезка пополам

гарнтирует обнаружение гадины за log2(1000) = 10 селектов.
23 авг 18, 17:38    [21652299]     Ответить | Цитировать Сообщить модератору
 Re: try внутри запроса  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
Владимир Затуливетер
попробовал тоже, но похоже он с xml не дружит.

select try_cast('xml?' as xml), try_cast('<xml></xml>' as xml)



                                                           
------------------------- -----------------------------------
xml? <xml />

(1 row affected)


Кто-нибудь скажет почему у меня не работает?...
я в общем-то ожидал NULL в первом столбце как например с int где у меня все верно возвращается.
select try_cast('not int' as int), try_cast('1234123' as int)


----------- -----------
NULL 1234123

(1 row affected)

Microsoft SQL Server 2017 (RTM-GDR) (KB4293803) - 14.0.2002.14 (X64)
Jul 21 2018 07:47:45
Copyright (C) 2017 Microsoft Corporation
Developer Edition (64-bit) on Windows 10 Pro 10.0 <X64> (Build 17134: )
23 авг 18, 18:09    [21652313]     Ответить | Цитировать Сообщить модератору
 Re: try внутри запроса  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7663
Владимир Затуливетер,

у Вас же нет требований проверки или операций.

select cast('aaa' as XML)
23 авг 18, 18:38    [21652330]     Ответить | Цитировать Сообщить модератору
 Re: try внутри запроса  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
В общем я понять не могу, как можно было выбрать только строки с валидным xml?
Автору темы try_cast помог как-то, только мне непонятно как именно.

with cteData (val)
as (
              select '<xml>234</xml>'
    union all select '<xml></xml>'
    union all select 'lskdjf'
)
select *
from cteData d
where try_cast(d.val as xml) is not null -- это не работает, все равно возвращает 3 строки
23 авг 18, 19:13    [21652364]     Ответить | Цитировать Сообщить модератору
 Re: try внутри запроса  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1351
Владимир Затуливетер,

with cteData (val)
as (
              select '<xml>234</xml>'
    union all select '<xml></xml>'
    union all select 'lskdjf'
)
select *
from cteData d
where try_cast(d.val as xml).exist('/*') = 1
23 авг 18, 19:41    [21652395]     Ответить | Цитировать Сообщить модератору
 Re: try внутри запроса  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
felix_ff,
ах вот оно как
23 авг 18, 19:48    [21652403]     Ответить | Цитировать Сообщить модератору
 Re: try внутри запроса  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
Вот так тоже работает, поэтому непонятно причем тут try_case.
with cteData (val)
as (
              select '<xml>234</xml>'
    union all select '<xml></xml>'
    union all select 'lskdjf'
)
select *
from cteData d
where cast(d.val as xml).exist('/*') = 1
23 авг 18, 19:53    [21652406]     Ответить | Цитировать Сообщить модератору
 Re: try внутри запроса  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1351
Владимир Затуливетер,

where try_cast(d.val as xml).exist('/text()') = 0


вот так даже правильней будет имхо
23 авг 18, 20:09    [21652420]     Ответить | Цитировать Сообщить модератору
 Re: try внутри запроса  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1351
Владимир Затуливетер,

у вас любой текст не содержащий спец символы разметки может быть представлен как тестовый узел xml поэтому cast и не ругается

select cast('something&' as xml)
go
select cast('<something' as xml)
go
select cast('something>' as xml)
go
select try_cast('something&' as xml)
go
select try_cast('<something' as xml)
go
select try_cast('something>' as xml)
23 авг 18, 20:14    [21652423]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить