SQL SERVER中的一些奇怪的现象

来源:互联网 发布:广告led屏数据无法读取 编辑:程序博客网 时间:2024/05/21 06:47

SQL SERVER中的一些奇怪的现象

一、平白无故多出一个空格

环境sqlserver2000 sp4+windowsxp sp3
if object_id('tb') <>0
  drop table tb
go
create table tb
( id varchar(10))

insert into tb
select 'a001'

 

select
             case when 1=2 then char(ascii(max(left(id,1)))+1)
                   else max(left(id,1)) end
              +right(cast(1000+count(*)+1 as varchar(4)),3)
        from tb

 

结果为 a 002,a后面多出一个空格。

对各个细节的测试结果:

select datalength(left(id,1)),                 --返回1,为a得长度
      datalength(max(left(id,1))),              --
返回1 ,为a的长度

      ascii(max(left(id,1))),                      --
返回97,为aascii

      datalength(ascii(max(left(id,1)))),        --
返回4,为aascii值(97)的长度,

      datalength(ascii(max(left(id,1)))+1),     --
返回4,为bascii值(98)的长度,

      datalength(char(ascii(max(left(id,1)))+1)),--
返回1,为b的长度

   datalength(case when 1=2 then char(ascii(max(left(id,1)))+1)else max(left(id,1)) end)  --
返回2,无论是case when中得条件 1=1,还是
1=2
from tb
group by id

 

可以看出在最后一个返回的数据长度为2,即’a ‘,很令人费解。注:在2005中没有该问题存在。

 

另外:此结论为FC所写,引用一下。

DECLARE @b varchar(10)

DECLARE @a char(1)

SET @b = 'bb'

SET @a = 'a'

SELECT CASE WHEN 1 = 1 THEN @a ELSE @a + '12345' END + 'b'

/*

a     b

7

 

@achar(1), '12345'为长5, 最后的b长为1,合计7

case when 表达式中,各分支长度依次为 1, 1+5 ,则表达式返回长度为6,最后+'b',共长为7

*/

DECLARE @b varchar(10)

DECLARE @a char(2)

SET @b = 'bb'

SET @a = 'a'

SELECT CASE WHEN 1 = 1 THEN @a ELSE @a + @b END + 'b'

/*

a           b

13

@achar(2),第一分支长2,第二分支长为 2+10,表达式返回长度为12,最后+'b',共长为13

*/

 



  
结论则是
    CASE WHEN
中对CHAR + VARCHAR 或二者互转的话,结果为CHAR,长度为分支中最大长度指定(避免数据丢失)

二、在SQL’,’可以转换数字

SQL SERVER2005

select isnumeric(','),cast(',' as money),cast(cast(',' as money) as float)结果为:

1   0.00  0

SQL 2000中:

select isnumeric(','),cast(',' as money),cast(cast(',' as money) as float)

1     .0000      0.0

 

对于’,’只能先转换为money型,不能直接转换为其他的类型。

原因: SQL中把’,’当做money型的分隔符了,就像把’.’当成小数点一样,可以参照:

select isnumeric('.'),cast('.' as money),cast(cast('.' as money) as float)

1     0.00     0

三、下面这个现象是在海爷的帖子中看到的,主要是关于sql语句的一些写法。

帖子的地址:http://topic.csdn.net/u/20090218/16/911db9e9-40f8-454e-bddd-b25ec5eed148.html

1、  创建表:

    CREATE TABLE #t (

    ID INT NOT NULL

    ,code NVARCHAR(30) NOT NULL

    ,[type] NVARCHAR(3) NOT NULL

    ,StatDate DATETIME NOT NULL

    ,Num INT

    ,

)   

这个是合理的,但是下面这个就错了

CREATE TABLE #t (

    ID INT NOT NULL

    ,code NVARCHAR(30) NOT NULL

    ,[type] NVARCHAR(3) NOT NULL

    ,StatDate DATETIME NOT NULL

    ,Num INT

    ,

    , )

 

2、有多个约束:

CREATE TABLE T1
(ID INT CONSTRAINT PK_ID3 PRIMARY KEY(ID) check(ID>0) ) 
GO
CREATE TABLE T2
(ID INT CONSTRAINT PK_ID3 PRIMARY KEY(ID),check(ID>0) ) 
GO
CREATE TABLE T3
(ID INT CONSTRAINT PK_ID3 PRIMARY KEY(ID) check(ID>0),) 
GO
CREATE TABLE T3
(ID INT CONSTRAINT PK_ID3 PRIMARY KEY(ID),check(ID>0),) 
GO
 

如果有多约束,它们之间的逗号可写可不写

3SQL编译器的现象

   use tempdb
go
if not object_id('T') is null
    drop table T
 
create table T(Col varchar(100))
insert T select 'abc '
 
select len(Col) as '不計算結尾空格',datalength(Col) as '計算結尾空格' from T
/*
 
不計算結尾空格     計算結尾空格
----------- -----------
3           4
 
(1 個資料列受到影響)
 
*/
 

      另外还有一些函数的转换问题,以前讨论过,找不到哪个函数了,以后找见了再续。