Try_convert issue * sql server 2012

时间:2015-04-20 09:39:31

标签: sql sql-server

为什么我在结果中得到*,我有两位数。?

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

4 个答案:

答案 0 :(得分: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,则必须增加大小。

您认为* {{1}}的原因是由于@ truncation of values中的@Damien_The_Unbeliever所提到的指定数据类型太大而导致comment

答案 1 :(得分:4)

这是因为生成的数据类型太短而无法显示。根据{{​​3}}

  

截断和舍入结果

     

转换字符或二进制表达式时(char,nchar,   nvarchar,varchar,binary或varbinary)到a的表达式   不同的数据类型,数据可以被截断,只能部分显示,   或者返回错误,因为结果太短而无法显示。   转换为char,varchar,nchar,nvarchar,binary和varbinary   被截断,但以下所示的转换除外   表

int , smallint, or tinyint转换为char /varchar

时会发生这种情况

答案 2 :(得分:3)

这是因为您明确尝试将其转换为varchar(1),如下所示,它将起作用:

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

如果您想将int,Float,Real值转换为varchar,请使用STR(),因为它可以更好地控制格式。 STR()函数是为具有小数点的近似数字(浮点)数据类型定义的,默认情况下,小数点又舍入为整数。

DEMO

答案 3 :(得分:1)

查询返回*,因为每当整数转换为(var)char并且其长度小于指定时,sql server返回*。您可以通过转换为varchar(2)来解决您的问题。看这篇文章 Why cast/convert from int returns an asterisk有关SQL返回*而非引发错误的更多信息。简而言之,这似乎是遗留行为。