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

Откуда:
Сообщений: 51
Пожалуйста, подскажите:
В C# есть конструкция is, при помощи которой можно проверить допустимость приведения значения к тому или иному типу.
Хотелось бы знать, есть ли что-нибудь аналогичное в sql.
Суть задачи в чем, есть поле типа VARCHAR(10)

И нужно что-то вроде этого

SELECT (CASE
WHEN FieldName IS INT
THEN CAST(FieldName AS INT)
ELSE 0
END) AS FieldRes
FROM Table
19 июн 14, 10:21    [16187286]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на допустимость приведения типов  [new]
Glory
Member

Откуда:
Сообщений: 104751
http://msdn.microsoft.com/en-us/library/hh230993.aspx
19 июн 14, 10:24    [16187317]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на допустимость приведения типов  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
mletov,

Вы совершенно не понимаете смысл оператора is.
В T-SQL нет наследования.

Зато есть TRY_CAST (Transact-SQL)
19 июн 14, 10:26    [16187331]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на допустимость приведения типов  [new]
mletov
Member

Откуда:
Сообщений: 51
Glory, iap

Спасибо, то, что нужно:)
19 июн 14, 11:08    [16187682]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на допустимость приведения типов  [new]
Dmitry V. Liseev
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 5489
Я правильно понимаю, что это есть только в 2012, а в остальных надо перехватывать исключение при помощи TRY и CATCH?
19 июн 14, 17:37    [16191204]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на допустимость приведения типов  [new]
mletov
Member

Откуда:
Сообщений: 51
Dmitry V. Liseev,

Да, к сожалению, это так

но для моей задачи меня выручили эти темы
https://www.sql.ru/forum/1001529/kak-proverit-chislo?mid=13861719#13861719
https://www.sql.ru/forum/1045426/analog-try-cast-v-2008
19 июн 14, 18:12    [16191394]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на допустимость приведения типов  [new]
Dmitry V. Liseev
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 5489
mletov
Dmitry V. Liseev,

Да, к сожалению, это так

но для моей задачи меня выручили эти темы
https://www.sql.ru/forum/1001529/kak-proverit-chislo?mid=13861719#13861719
https://www.sql.ru/forum/1045426/analog-try-cast-v-2008
Я тоже видел подобные темы. Впечатлился масштабами хакерского кода. Вспомнил бритву Оккама. Вздохнул. И написал
BEGIN TRY SET @Number = @NumberText; END TRY BEGIN CATCH END CATCH;
19 июн 14, 18:21    [16191429]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на допустимость приведения типов  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
Dmitry V. Liseev
Я тоже видел подобные темы. Впечатлился масштабами хакерского кода. Вспомнил бритву Оккама. Вздохнул. И написал
BEGIN TRY SET @Number = @NumberText; END TRY BEGIN CATCH END CATCH;


только вот, в функциях так нельзя.
19 июн 14, 18:27    [16191448]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на допустимость приведения типов  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
Dmitry V. Liseev
Я тоже видел подобные темы. Впечатлился масштабами хакерского кода. Вспомнил бритву Оккама. Вздохнул. И написал
BEGIN TRY SET @Number = @NumberText; END TRY BEGIN CATCH END CATCH;

это если не нужна именно функция
19 июн 14, 18:28    [16191450]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на допустимость приведения типов  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 8933
Dmitry V. Liseev,

с использованием внутри select у бритвы Оккама будут проблемы
19 июн 14, 18:29    [16191458]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на допустимость приведения типов  [new]
Dmitry V. Liseev
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 5489
daw
Dmitry V. Liseev
Я тоже видел подобные темы. Впечатлился масштабами хакерского кода. Вспомнил бритву Оккама. Вздохнул. И написал
BEGIN TRY SET @Number = @NumberText; END TRY BEGIN CATCH END CATCH;


только вот, в функциях так нельзя.
Нельзя.
19 июн 14, 18:51    [16191538]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на допустимость приведения типов  [new]
invm
Member

Откуда: Москва
Сообщений: 9844
Для 2005 - 2008R2 можно вот так извратиться:
use tempdb;
go

create function dbo.ConvertStringToInt
(
 @Value varchar(10)
)
returns int
as
begin
 declare @x xml;

 select @x = (select @Value for xml path('Value'));
 return cast(nullif(cast(@x.query('xs:int(/Value[1])') as varchar(10)), '') as int);
end;
go

select
 dbo.ConvertStringToInt('-1'),
 dbo.ConvertStringToInt('2147483647'),
 dbo.ConvertStringToInt('2147483648'),
 dbo.ConvertStringToInt('aaa');
go

drop function dbo.ConvertStringToInt;
go
19 июн 14, 19:42    [16191737]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на допустимость приведения типов  [new]
sphinx_mv
Member [заблокирован]

Откуда:
Сообщений: 1672
mletov
Пожалуйста, подскажите:
В C# есть конструкция is, при помощи которой можно проверить допустимость приведения значения к тому или иному типу.
Хотелось бы знать, есть ли что-нибудь аналогичное в sql.
Суть задачи в чем, есть поле типа VARCHAR(10)

И нужно что-то вроде этого

SELECT (CASE
WHEN FieldName IS INT
THEN CAST(FieldName AS INT)
ELSE 0
END) AS FieldRes
FROM Table
О, ужас!.. :)
Сколько помню MSSQL, всегда было ISNUMERIC

ЗЫ. Аналогичное было для проверки даты - ISDATE
20 июн 14, 10:19    [16193550]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на допустимость приведения типов  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
sphinx_mv
О, ужас!.. :)
Сколько помню MSSQL, всегда было ISNUMERIC
И что же означает 1, которую возвращает ISNUMERIC(), по-Вашему?
Этого достаточно, да?
20 июн 14, 10:32    [16193636]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на допустимость приведения типов  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
sphinx_mv
Сколько помню MSSQL, всегда было ISNUMERIC


SELECT ISNUMERIC('$178'), ISNUMERIC('+'), ISNUMERIC(','), ISNUMERIC('.'), ISNUMERIC('12d0')
20 июн 14, 11:02    [16193883]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на допустимость приведения типов  [new]
sphinx_mv
Member [заблокирован]

Откуда:
Сообщений: 1672
iap
sphinx_mv
О, ужас!.. :)
Сколько помню MSSQL, всегда было ISNUMERIC
И что же означает 1, которую возвращает ISNUMERIC(), по-Вашему?
Этого достаточно, да?
Для проверки допустимости конвертации - да.
Тем более, что очень не все уже перешли хотя бы на 2012 версию SQL.
20 июн 14, 11:06    [16193923]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на допустимость приведения типов  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8834
А что не так с ISNUMERIC()? Эта функция как раз проверяет возможность конвертирования строки в числовой формат.
20 июн 14, 11:08    [16193938]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на допустимость приведения типов  [new]
случайно заглянул
Guest
Ruuu
sphinx_mv
Сколько помню MSSQL, всегда было ISNUMERIC


SELECT ISNUMERIC('$178'), ISNUMERIC('+'), ISNUMERIC(','), ISNUMERIC('.'), ISNUMERIC('12d0')


а также еще
SELECT ISNUMERIC('3e8'), ISNUMERIC('-')

:)
20 июн 14, 11:08    [16193941]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на допустимость приведения типов  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8834
А не то, о чем все думают
20 июн 14, 11:08    [16193944]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на допустимость приведения типов  [new]
msLex
Member

Откуда:
Сообщений: 9303
sphinx_mv
iap
пропущено...
И что же означает 1, которую возвращает ISNUMERIC(), по-Вашему?
Этого достаточно, да?
Для проверки допустимости конвертации - да.
Тем более, что очень не все уже перешли хотя бы на 2012 версию SQL.

т.е. что-то типа?

declare 
  @f varchar(10) = '100'
declare 
  @f_int int = case when isnumeric(@f) = 1 then cast(f as int) else null end
20 июн 14, 11:09    [16193945]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на допустимость приведения типов  [new]
случайно заглянул
Guest
msLex
sphinx_mv
пропущено...
Для проверки допустимости конвертации - да.
Тем более, что очень не все уже перешли хотя бы на 2012 версию SQL.

т.е. что-то типа?

declare 
  @f varchar(10) = '100'
declare 
  @f_int int = case when isnumeric(@f) = 1 then cast(f as int) else null end

Select забыли.
А вы прочитали что вам написали чуть повыше про isnumeric()?
Если вас это устраивает, то в путь...
Но тогда лучше так:

declare
  @f varchar(10) = '100'
declare  
  @f_int int = nullif(isnumeric(@f), 0)
20 июн 14, 11:14    [16193990]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на допустимость приведения типов  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 8933
Владислав Колосов
А что не так с ISNUMERIC()? Эта функция как раз проверяет возможность конвертирования строки в числовой формат.

"Число ли это?" и "Можно ли это сконвертировать в INT?" - это совершенно разные вопросы ;)
Как минимум, IsNumeric не поймает переполнение (не говоря уже про упоминавшиеся выше записи с плавающей точкой и т.п.)
20 июн 14, 11:16    [16193998]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на допустимость приведения типов  [new]
случайно заглянул
Guest
ааа, и еще :)
isnumeric() это не только int.
20 июн 14, 11:16    [16194003]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на допустимость приведения типов  [new]
msLex
Member

Откуда:
Сообщений: 9303
случайно заглянул
declare
  @f varchar(10) = '100'
declare  
  @f_int int = nullif(isnumeric(@f), 0)


что за бред вы написали? где здесь конвертация сроки '100' к числу 100?


случайно заглянул
А вы прочитали что вам написали чуть повыше про isnumeric()?

а вы почитали
1. кому написали про isnumeric?
2. кому я написал по isnumeric?
20 июн 14, 11:18    [16194018]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на допустимость приведения типов  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
Владислав Колосов
А что не так с ISNUMERIC()? Эта функция как раз проверяет возможность конвертирования строки в числовой формат.
только вы не знаете в какой. для строки '-$' вернет 1, т.к. можно конвертировать в (small)money и только, а для '3e8' - потому что можно в float, но не money или int.
20 июн 14, 11:20    [16194032]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить