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,为a的ascii值
datalength(ascii(max(left(id,1)))), --返回4,为a得ascii值(97)的长度,
datalength(ascii(max(left(id,1)))+1), --返回4,为b得ascii值(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
@a为char(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
@a为char(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
如果有多约束,它们之间的逗号可写可不写
3、SQL编译器的现象
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 個資料列受到影響)
*/
另外还有一些函数的转换问题,以前讨论过,找不到哪个函数了,以后找见了再续。
- SQL SERVER中的一些奇怪的现象
- intellij idea 的一些奇怪现象
- 关于SQL Server自动备份无法删除过期的备份文件奇怪现象
- iframe中的奇怪现象
- 求救!!!奇怪的现象!
- 奇怪的现象
- noskipws()的奇怪现象!
- 好奇怪的现象
- 奇怪的UNION现象
- java的奇怪现象
- 奇怪的现象
- SQL Server中的一个奇怪问题
- CSS 中的一个奇怪现象
- 关于C++ 中的插入符 << : 一个奇怪的现象
- 关于Session的奇怪现象
- 关于Session的奇怪现象
- hql一个奇怪的现象
- windows的又一个奇怪现象
- 浪潮之巅 第五章 奔腾的芯 Intel(3)指令集之争
- 误用的函数
- xterm DECRQSS Remote Command Execution Vulnerability
- 创建一个xml文件(c:/test.html),为该文件增加三个节点,,,将b的attribute改为4并保存
- 瀑布和XP开发过程模型
- SQL SERVER中的一些奇怪的现象
- Poderosa Special version 帮助-杂项功能
- w24 WIFI模块实现AD-HOC 通明传输
- 开始我的技术之路
- 海角七号,爱的味道
- Document 对象的方法
- debug中修改标志寄存器
- HTML DOM 实例
- 我发霉了