我正在处理运行 SQL Server 2000 SP1 的服务器,其中一个数据库的逻辑文件名似乎包含尾随空格。即此查询:
select replace(name, ' ', 'X') from sysfiles
返回预期的名称加上一长串 X。
我该如何处理这个问题?我尝试使用名称(带空格和不带空格)运行 ALTER DATABASE...MODIFY FILE,但收到一条错误消息,告诉我该文件不存在。
答案1
这并不是因为名称中含有空格,而是因为 Sql Server 将此数据存储在以下类型的字段中nchar(128),固定宽度字符数据类型(即存储的数据将始终为 128 个字符长,必要时用空格填充)。因此,当您查询该值时,您将始终获得长度为 128 个字符的类型。如果您想修剪数据类型的尾部空格填充,只需将其转换为可变长度数据类型,或显式修剪它,如下所示:
select cast(name as nvarchar(128)) as name from sysfiles
或者
select rtrim(name) as name from sysfiles
或者如果您打算插入到另一个表中,如果目标数据类型是可变长度且兼容,它将隐式转换:
create table #files (name nvarchar(128));
insert #files (name) select name from sysfiles;
select name from #files;
如果你稍微修改一下上面的陈述,你会注意到不再有尾随的 X:
select replace(cast(name as nvarchar(128)), ' ', 'X') from sysfiles