我的表中有超过30列(sql server 2008)。列类型是varchar(x)。我知道在每列中在列值的末尾都有两个额外的空格。如何对所有列使用rtrim函数并将此修改保存到此现有表中?SQL Server:如何在表中的所有varchar列上执行Rtrim
编辑:有没有办法使用存储过程或游标做到这一点,我不必手动声明所有列?
我的表中有超过30列(sql server 2008)。列类型是varchar(x)。我知道在每列中在列值的末尾都有两个额外的空格。如何对所有列使用rtrim函数并将此修改保存到此现有表中?SQL Server:如何在表中的所有varchar列上执行Rtrim
编辑:有没有办法使用存储过程或游标做到这一点,我不必手动声明所有列?
对于一个通用的方法,你可以使用这样的脚本生成的语句为你,为给定的表(有用的,如果你有很多列!):
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)
。这是未经测试的,所以只需先在测试表上试试:)
UPDATE xxx
SET col1 = RTRIM(col1),
col2 = RTRIM(col2),
col3 = RTRIM(col3),
...
我们可以通过存储过程来修整specific table
下的specific schema
。如果我们有不同于默认dbo
模式的模式名称,最好通过传递模式名称和表名来使用此SP。这同时执行LTRIM
和RTRIM
。该SP将检查char
,nchar
,varchar
, 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'
接受的答案效果很好。我遇到了一个与临时表名称相同的问题。您可以添加
and TABLE_SCHEMA = 'dbo'
而这将消除表名冲突。
它是完美的......但记得也把where
条款:
COLUMNPROPERTY(OBJECT_ID(TABLE_SCHEMA+'.'+TABLE_NAME),COLUMN_NAME,'IsComputed') = 0
Ohterwise你会得到一个错误,如果表中有"%char%"
类型的计算列!
最好是'DATA_TYPE'如'%char%''否则我们可能会错过char和nchar数据类型字段。 – Shiva 2015-03-04 10:28:14
@Shiva - no。 CHAR和NCHAR值总是用空白填充,所以这没有用处。可以包含NVARCHAR,但OP的问题是围绕VARCHARs – AdaTheDev 2015-03-04 14:44:30
@AdaTheDev - Right ..'DATA_TYPE就像'%varchar%''会很好。 – Shiva 2015-03-04 15:24:39