2009-11-18 66 views
0

CHAR行为,我希望查询的结果是:与下面给出的SQL语句结尾空格

|testX|5| 
|XXXXX|5| 

这是因为该列是char(5),我希望它插入由于插入的值少于5个字符,因此空白尾部空格可填充列中的剩余空间。但是,查询实际上产生以下结果:

|test|4| 
|X|0| 

有人可以请解释这一点。为什么没有用尾部填充的值填充长度5列?为什么当REPLACE函数是一个完全为空的字符串时,为第二个值插入单个X?

USE Test; 
GO 

SET ANSI_PADDING ON; 
GO 

CREATE TABLE BlankTest 
(
    Value char(5) NOT NULL 
); 
GO 

INSERT INTO BlankTest (
    Value 
) VALUES (
    'test' 
); 
GO 

INSERT INTO BlankTest (
    Value 
) VALUES (
    '' 
); 
GO 

SELECT REPLACE(Value, ' ', 'X'), LEN(Value) 
FROM BlankTest; 
GO 

DROP TABLE BlankTest; 

回答

2

REPLACE返回值VARCHAR

试试这个为SELECT

...REPLACE(Value, ' ', 'ZZZZZZZZZ') 

这不可能是CHAR(5),当然,是什么呢

...SQL_VARIANT_PROPERTY (REPLACE(Value, ' ', 'ZZZZZZZZZ'), 'MaxLength')... 

8000,最大的varchar ...

编辑:

  1. 我的智能亚历克的同事提醒我说,你需要使用DATALENGTH包括尾随空格,不LEN。 Asked often here

  2. WHERE value = 'test'。 “测试”这里是具有higher precedence (fixed)不是char VARCHAR,所以列转换为varchar,从而有效地截断

+0

OK,但鉴于同样的数据,如果我做一个 SELECT * FROM BlankTest 值='test'; 我得到一行返回。我不应该收到零行,因为插入的值,填充,将'测试','测试'!='测试'。 – NYSystemsAnalyst 2009-11-18 15:06:36

+0

太好了,谢谢。你有关于数据类型优先级的任何文档的链接吗?您为更高优先级放置的链接链接到与datalength和len上面的链接相同的问题,并没有讨论优先级问题。 – NYSystemsAnalyst 2009-11-18 15:43:12

+0

哎呀,固定..... – gbn 2009-11-18 15:45:18