2015-09-02 2 views
2

Я получаю сообщение об ошибке при выполнении ниже запроса в SQL Server 2012:Проблема с преобразованием/конверсией в SQL Server 2012?

DECLARE @Id NVARCHAR(max) = 2147483648 

DECLARE @Result BIGINT = 0 

IF (
    @Id = 0 
    OR @Id = '' 
    ) 

BEGIN 

    SET @Result = NULL 

END 

ELSE 

BEGIN 

    SET @Result = convert(bigint,@id) 

END 

Выход:

Msg 248, уровень 16, состояние 1, строка 3 Преобразование значения NVARCHAR «2147483648 'переполнен столбцом int.

Может кто-нибудь предложить мне, почему это происходит?

Заранее спасибо

+0

Попробуйте 'DECLARE @Id NVARCHAR (макс) = '2147483648'' – lad2025

+1

и' IF (@Id =' 0'OR @Id = '') ':) – wiretext

ответ

0

преобразовательной 0 в bigint будет работать, потому что по умолчанию 0 будет рассматриваться как INT

DECLARE @Id NVARCHAR(max) = 2147483648 
DECLARE @Result BIGINT = 0 

IF (@Id = cast(0 as bigint) -- or = '0' 
     OR @Id = '') 
    BEGIN 
     SET @Result = NULL 
    END 
ELSE 
    BEGIN 
     SET @Result = CONVERT(BIGINT, @id) 
    END 
0

Вы должны использовать '' при установке @id = '0' в следующем:

DECLARE @Id NVARCHAR(max) = 2147483648 

DECLARE @Result BIGINT = 0 

IF (
    @Id = '0' 
    OR @Id = '' 
    ) 

BEGIN 

    SET @Result = NULL 

END 

ELSE 

BEGIN 

    SET @Result = convert(bigint,@id) 

END 
0

Когда вы сравниваете varchar с int. varchar преобразуется в int перед сравнением.

Когда оператор объединяет два выражения различных типов данных, то правила типа данных старшинства указать, что тип данных с более низким приоритетом преобразуется в тип данных с более высоким приоритетом . Если преобразование не поддерживается неявным преобразованием, возвращается .

Когда @ID (= '2147483648') преобразуется в int она превышает предел макс int. следовательно, вы получили ошибку;

INT
-2^31 (-2147483648) до 2^31-1 (2147483647)
4 Б

Решение:
Преобразование в и к varchar

IF (@Id = '0' OR @Id = '') 

Конвертировать @Id в bigint.

IF (convert(bigint, @Id) = 0 OR @Id = '')