Преобразование в десятичное в SQL Server 2008 - PullRequest
0 голосов
/ 28 января 2019

Я использовал Try_Parse для преобразования значения nvarchar в десятичное, и оно отлично работает в SQl Server 2012 и выше, но теперь я должен поддерживать тот же запрос в 2008 году. Запрос выдает ошибку.Есть ли простой способ реализовать Try Parse в Sql Server 2008.

Это похоже на ошибку

select Cast('' as decimal)
select Cast('22#' as decimal)

Могу ли я получить значение 0 в случае сбоя приведения.

Спасибо

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Поскольку у вас нет функций синтаксического анализа и вы используете SQL Server 2008, этот подход будет работать.Не очень эффективный, но не много вариантов.Вы можете использовать что-то на основе этого шаблона try..catch, чтобы написать собственную функцию для проверки десятичного числа.

DECLARE @Values TABLE(
        ID INT IDENTITY(1,1)
    ,   [Value] VARCHAR(20)
)
INSERT INTO @Values SELECT '22.1'
INSERT INTO @Values SELECT '22.1 sdfsfds'

DECLARE @GoodValues TABLE(ID INT)
DECLARE @BadValues TABLE(ID INT)

DECLARE @ID INT
DECLARE @Value VARCHAR(20)
DECLARE @ValueAsDecimal DECIMAL

DECLARE tryparse_cursor CURSOR FOR   
SELECT ID, [Value]  
FROM @Values

OPEN tryparse_cursor  

FETCH NEXT FROM tryparse_cursor   
INTO @ID, @Value  

WHILE @@FETCH_STATUS = 0  
BEGIN
    BEGIN TRY
        SET @ValueAsDecimal=CAST(@Value AS DECIMAL);
        INSERT INTO @GoodValues SELECT @ID;
    END TRY
    BEGIN CATCH
        INSERT INTO @BadValues SELECT @ID;
    END CATCH

    FETCH NEXT FROM tryparse_cursor   
    INTO @ID, @Value   
END   
CLOSE tryparse_cursor;  
DEALLOCATE tryparse_cursor;  

select * from @GoodValues
select * from @BadValues
0 голосов
/ 28 января 2019

Одним из способов было бы изменить подход, основанный на множествах, на подход строка за строкой и поместить ваш код в блок TRY..CATCH.

Другой способ - написать UDF, который используетблок TRY..CATCH и вызовите его из кода на основе набора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...