2010-03-31 138 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%"類型的計算列!

相關問題