我的表中有超過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