日期:2014-05-18  浏览次数:20507 次

SQL 简单的返回值区别
CREATE TABLE t1 
(
 c1 varchar(3),
 c2 char(3)
)
GO
INSERT INTO t1 VALUES ('2', '2')
INSERT INTO t1 VALUES ('37', '37')
INSERT INTO t1 VALUES ('597', '597')
GO
SELECT REPLICATE('0', 3 - DATALENGTH(c1)) + c1 AS 'Varchar Column',
  REPLICATE('0', 3 - DATALENGTH(c2)) + c2 AS 'Char Column'
FROM t1
GO



Varcgar Column Char Column
002 2  
037 37 
597 597

为什么会返回不一样的值 ,一样的值,一样的写法。
就是类型不一样。
感觉 下面的内条语句 REPLICATE('0', 3 - DATALENGTH(c2)) + c2 AS 'Char Column'
并没有把‘0’当成字符型, 而是直接当成了。数字型0,所有才没有返回数据前面的0
求高手解答阿。

------解决方案--------------------
SQL code
SELECT 
DATALENGTH(c1) as c1len,
DATALENGTH(c2) as c2len
FROM t1

------解决方案--------------------
如楼上所说,char型数据,如果字符串没有填满,后面则跟随' '
代码更改为如下即可:

SQL code
CREATE TABLE t1  
(
 c1 varchar(3),
 c2 char(3)
)
GO
INSERT INTO t1 VALUES ('2', '2')
INSERT INTO t1 VALUES ('37', '37')
INSERT INTO t1 VALUES ('597', '597')
GO
SELECT REPLICATE('0', 3 - DATALENGTH(c1)) + c1 AS 'Varchar Column',
  REPLICATE('0', 3 - DATALENGTH(rtrim(c2))) + c2 AS 'Char Column'
FROM t1

drop table t1

/*
Varchar Column Char Column 
-------------- ------------
002            002 
037            037 
597            597

(所影响的行数为 3 行)
*/