2015-04-20 6 views
3

Почему я получаю *, в результате чего у меня есть две цифры.?Try_convert issue * sql server 2012

Declare @Product TABLE(id int identity(1,1),Cust VARCHAR(25), 
         Product VARCHAR(20), QTY INT) 

INSERT INTO @Product(Cust, Product, QTY) 
VALUES('KATE','VEG',2), 
     ('KATE','SODA',6), 
     ('KATE','MILK',1), 
     ('KATE','BEER',12), 
     ('FRED','MILK',3), 
     ('FRED','BEER',24), 
     ('KATE','VEG',3) 


select *,TRY_CONVERT(varchar(1),QTY) qty1 from @Product 
+0

Поскольку это [зарегистрированное поведение] (https://msdn.microsoft.com/en-us/library/ms187928.aspx)? «Конверсии в char, varchar, nchar, nvarchar, binary и varbinary усекаются, за исключением преобразований, показанных в следующей таблице». - 'int'-' * '. –

+0

Отлично, я получил его сейчас от всех, кто ответил и дал в комментариях.всем спасибо. – chanti

ответ

4

Это происходит потому, что в результате тип данных является слишком коротким, чтобы отобразить. Согласно msdn

Усечение и округление Результаты

При преобразовании символов или двоичные выражения (голец, NCHAR, NVARCHAR, VARCHAR, двоичном или VARBINARY) к выражению другого типа данных , данные могут быть усечены, только частично отображаться, или ошибка возвращается, потому что результат слишком короткий для отображения. Преобразования в char, varchar, nchar, nvarchar, двоичные и varbinary усечены, за исключением преобразований, указанных в таблице .

Это происходит при преобразовании из int , smallint, or tinyint в char /varchar

4

Вы указали только один символ в своем TRY_CONVERT(VARCHAR(1), QTY) qty1.

Если вы измените его на VARCHAR(2), он будет работать:

DECLARE @Product TABLE 
    (
     id INT IDENTITY(1, 1) , 
     Cust VARCHAR(25) , 
     Product VARCHAR(20) , 
     QTY INT 
    ) 

INSERT INTO @Product 
     (Cust, Product, QTY) 
VALUES ('KATE', 'VEG', 2), 
     ('KATE', 'SODA', 6), 
     ('KATE', 'MILK', 1), 
     ('KATE', 'BEER', 12), 
     ('FRED', 'MILK', 3), 
     ('FRED', 'BEER', 24), 
     ('KATE', 'VEG', 3) 


SELECT * , 
     TRY_CONVERT(VARCHAR(2), QTY) qty1 
FROM @Product 

Я не уверен, почему вы хотите, чтобы преобразовать QTY в VARCHAR, хотя, как это в INT. Размер должен был бы увеличиться, если бы у вас был QTY = 200.

Причина вы видите * из-за truncation of values, которые являются слишком большими для указанного типа данных, как упомянуто @Damien_The_Unbeliever в его comment.

3

Это потому, что вы явно пытается преобразовать его в varchar(1), писать, как показано ниже, и она будет работать:

select *,TRY_CONVERT(varchar(2),QTY) qty1 from Product

Если вы хотите конвертировать int,Float,Real значения использования VARCHAR STR() вместо как это позволяет лучше контролировать форматирование. STR() Функция определена для приблизительного численного (плавающего) типа данных с десятичной точкой, которая по умолчанию округляется до целого по умолчанию.

DEMO

+0

Это фактически отвечает на вопрос ОП – Dhaval

1

запрос возвращает *, потому что возвращает SQL Server * всякий раз, когда целое число преобразуется в (вар) полукокса и его длина меньше, чем указано. Вы можете решить свою проблему, перейдя на varchar (2). См. Это сообщение Why cast/convert from int returns an asterisk для получения дополнительной информации, почему SQL возвращает a * вместо повышения в ошибке. Короче говоря, это похоже на наследие.