2010-03-31 139 views
16

我的表中有超过30列(sql server 2008)。列类型是varchar(x)。我知道在每列中在列值的末尾都有两个额外的空格。如何对所有列使用rtrim函数并将此修改保存到此现有表中?SQL Server:如何在表中的所有varchar列上执行Rtrim

编辑:有没有办法使用存储过程或游标做到这一点,我不必手动声明所有列?

回答

29

对于一个通用的方法,你可以使用这样的脚本生成的语句为你,为给定的表(有用的,如果你有很多列!):

DECLARE @SQL VARCHAR(MAX) 
DECLARE @TableName NVARCHAR(128) 
SET @TableName = 'YourTableName' 

SELECT @SQL = COALESCE(@SQL + ',[', '[') + 
       COLUMN_NAME + ']=RTRIM([' + COLUMN_NAME + '])' 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = @TableName 
    AND DATA_TYPE = 'varchar' 

SET @SQL = 'UPDATE [' + @TableName + '] SET ' + @SQL 
PRINT @SQL 

这将只打印SQL语句。您可以复制+运行该语句,或者只是EXECUTE(@SQL)。这是未经测试的,所以只需先在测试表上试试:)

+0

最好是'DATA_TYPE'如'%char%''否则我们可能会错过char和nchar数据类型字段。 – Shiva 2015-03-04 10:28:14

+2

@Shiva - no。 CHAR和NCHAR值总是用空白填充,所以这没有用处。可以包含NVARCHAR,但OP的问题是围绕VARCHARs – AdaTheDev 2015-03-04 14:44:30

+0

@AdaTheDev - Right ..'DATA_TYPE就像'%varchar%''会很好。 – Shiva 2015-03-04 15:24:39

18
UPDATE xxx 
    SET col1 = RTRIM(col1), 
     col2 = RTRIM(col2), 
     col3 = RTRIM(col3), 
     ... 
1

我们可以通过存储过程来修整specific table下的specific schema。如果我们有不同于默认dbo模式的模式名称,最好通过传递模式名称和表名来使用此SP。这同时执行LTRIMRTRIM。该SP将检查char,ncharvarchar, nvarchar列。

CREATE PROCEDURE [dbo].[TrimAllColumnsOfTable] @SchemaName Varchar(100),@TableName Varchar(100) 
AS 
BEGIN 

DECLARE @SQL VARCHAR(MAX) 
SELECT @SQL = COALESCE(@SQL + ',[', '[') + 
       COLUMN_NAME + ']=LTRIM(RTRIM([' + COLUMN_NAME + ']))' 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_SCHEMA = @SchemaName AND TABLE_NAME = @TableName AND DATA_TYPE Like '%char%' 

SET @SQL = 'UPDATE [' + @SchemaName + '].[' + @TableName + '] SET ' + @SQL 

EXEC (@SQL) 

END 

用法:[TrimAllColumnsOfTable] 'SchemaName','TableName'

0

接受的答案效果很好。我遇到了一个与临时表名称相同的问题。您可以添加

and TABLE_SCHEMA = 'dbo' 

而这将消除表名冲突。

1

它是完美的......但记得也把where条款:

COLUMNPROPERTY(OBJECT_ID(TABLE_SCHEMA+'.'+TABLE_NAME),COLUMN_NAME,'IsComputed') = 0

Ohterwise你会得到一个错误,如果表中有"%char%"类型的计算列!

相关问题