鉴于下面的SQL语句,我希望查询的结果是:
|testX|5|
|XXXXX|5|
这是因为列是一个char(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;
答案 0 :(得分:2)
REPLACE返回varchar
尝试使用SELECT
...REPLACE(Value, ' ', 'ZZZZZZZZZ')
当然,这不是char(5),所以它是什么
...SQL_VARIANT_PROPERTY (REPLACE(Value, ' ', 'ZZZZZZZZZ'), 'MaxLength')...
8000,最大varchar ...
编辑:
我聪明的alec同事提醒我,你需要使用DATALENGTH来包含尾随空格,而不是LEN。 Asked often here
WHERE value = 'test'
。这里的'test'是varchar,它的字符比higher precedence (fixed)多,所以该列被转换为varchar,从而有效地截断