none
Sql Server 2005 字符的默认返回类型 RRS feed

  • 问题

  • 请问一下如果有如下的Select语句
    Select '123' As Text
    Union All
    Select '123456'

    Sql 的默认返回的Text列的类型是什么?是char、nchar、nvarchar还是varchar?

    如果返回类型不是varchar,有没有什么方法设置让Sql的默认返回的类型是Varcher,而不用Cast或者Convert?

    先谢谢。


    xulan
    2010年9月7日 1:21

答案

  • Should be varchar and can't change as I understand.
    • 已标记为答案 xulanb 2010年9月9日 6:52
    2010年9月7日 1:48
  • SELECT * 
    INTO TypeTable_test 
    FROM (
         SELECT '123' AS TEXT
         UNION ALL
         SELECT '123456'
       ) t
    
    
    SELECT TYPE_NAME(xtype) typename,length, xprec, xscale 
    FROM syscolumns
    WHERE id = OBJECT_ID('TypeTable_test')
    /*
    typename     length xprec xscale
    ---------------- ------ ----- ------
    VARCHAR     6   0   0
    
    (1 行受影响)
    */
    DROP TABLE TypeTable_test
    
    
    是Varchar型。
    

    如果您得到满意的答复,请将正确的回复标记为答案,以示问题解决,方便其他人浏览!Ths!
    2010年9月7日 1:53
  • 类型是跟您的语句有关

     

    --INT(4)
    SELECT 123		
    
    --VARCHAR(3)
    SELECT '123'
    
    --NVARCHAR(6)
    SELECT N'123'
    
    而长度是容得下你语句内容的最小长度。

     

    2010年9月7日 2:26
  • 另外也要注意一下隐式类型转换,下面这两种情况都会被转成int类型。

    SELECT Text+'S' AS MyText
    FROM (
       SELECT '123'+1 AS TEXT
       UNION ALL
       SELECT '123456'
      ) t
    
    SELECT Text+'S' AS MyText
    FROM (
       SELECT '123' AS TEXT
       UNION ALL
       SELECT '123456'
       UNION ALL
       SELECT 1
      ) t
    
    --Msg 245, Level 16, State 1, Line 1
    --Conversion failed when converting the varchar value 'S' to data type int.
    
    2010年9月7日 3:31
    版主
  • 下面的示例帮助你去了解常量的数据类型和长度

     

    DECLARE
    	@test sql_variant
    ;
    SET @test = 'a';
    
    SELECT
    	SQL_VARIANT_PROPERTY(@test, 'BaseType'),
    	SQL_VARIANT_PROPERTY(@test, 'maxlength')
    ;
    
    SET @test = CONVERT(varchar(100), 'aaa');
    
    SELECT
    	SQL_VARIANT_PROPERTY(@test, 'BaseType'),
    	SQL_VARIANT_PROPERTY(@test, 'maxlength')
    ;
    
    
    2010年9月7日 4:46

全部回复

  • Should be varchar and can't change as I understand.
    • 已标记为答案 xulanb 2010年9月9日 6:52
    2010年9月7日 1:48
  • SELECT * 
    INTO TypeTable_test 
    FROM (
         SELECT '123' AS TEXT
         UNION ALL
         SELECT '123456'
       ) t
    
    
    SELECT TYPE_NAME(xtype) typename,length, xprec, xscale 
    FROM syscolumns
    WHERE id = OBJECT_ID('TypeTable_test')
    /*
    typename     length xprec xscale
    ---------------- ------ ----- ------
    VARCHAR     6   0   0
    
    (1 行受影响)
    */
    DROP TABLE TypeTable_test
    
    
    是Varchar型。
    

    如果您得到满意的答复,请将正确的回复标记为答案,以示问题解决,方便其他人浏览!Ths!
    2010年9月7日 1:53
  • 类型是跟您的语句有关

     

    --INT(4)
    SELECT 123		
    
    --VARCHAR(3)
    SELECT '123'
    
    --NVARCHAR(6)
    SELECT N'123'
    
    而长度是容得下你语句内容的最小长度。

     

    2010年9月7日 2:26
  • 另外也要注意一下隐式类型转换,下面这两种情况都会被转成int类型。

    SELECT Text+'S' AS MyText
    FROM (
       SELECT '123'+1 AS TEXT
       UNION ALL
       SELECT '123456'
      ) t
    
    SELECT Text+'S' AS MyText
    FROM (
       SELECT '123' AS TEXT
       UNION ALL
       SELECT '123456'
       UNION ALL
       SELECT 1
      ) t
    
    --Msg 245, Level 16, State 1, Line 1
    --Conversion failed when converting the varchar value 'S' to data type int.
    
    2010年9月7日 3:31
    版主
  • 对于常量而言, 如果要保证类型和长度, 显式的 CAST 和 CONVERT 是必须的.
    2010年9月7日 4:40
  • 下面的示例帮助你去了解常量的数据类型和长度

     

    DECLARE
    	@test sql_variant
    ;
    SET @test = 'a';
    
    SELECT
    	SQL_VARIANT_PROPERTY(@test, 'BaseType'),
    	SQL_VARIANT_PROPERTY(@test, 'maxlength')
    ;
    
    SET @test = CONVERT(varchar(100), 'aaa');
    
    SELECT
    	SQL_VARIANT_PROPERTY(@test, 'BaseType'),
    	SQL_VARIANT_PROPERTY(@test, 'maxlength')
    ;
    
    
    2010年9月7日 4:46