SQL Server: как выполнить Rtrim для всех столбцов varchar таблицы
У меня более 30 столбцов в моей таблице (sql server 2008). Тип столбцов - varchar (x). Я знаю, что в каждом столбце есть два дополнительных пробела в конце значения столбца. Как использовать функцию rtrim для всех столбцов и сохранить эту модификацию в этой существующей таблице?
Изменить: есть ли способ сделать это с помощью хранимой процедуры или курсора, где мне не нужно вручную объявлять все столбцы?
Ответы
Ответ 1
Для общего подхода вы можете использовать script, как это, для создания оператора для вас для данной таблицы (полезно, если у вас много столбцов!):
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)
. Это непроверено, поэтому сначала попробуйте сначала на тестовой таблице:)
Ответ 2
UPDATE xxx
SET col1 = RTRIM(col1),
col2 = RTRIM(col2),
col3 = RTRIM(col3),
...
Ответ 3
Мы можем иметь хранимую процедуру для обрезки 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'
Ответ 4
Это прекрасно... Но не забудьте также поставить предложение where
:
COLUMNPROPERTY(OBJECT_ID(TABLE_SCHEMA+'.'+TABLE_NAME),COLUMN_NAME,'IsComputed') = 0
В противном случае вы получите сообщение об ошибке, если таблица имеет вычисленный столбец типа "%char%"
!
Ответ 5
Принятый ответ работает хорошо. Я столкнулся с проблемой, когда временная таблица называется с тем же именем. Вы можете добавить
and TABLE_SCHEMA = 'dbo'
И это избавит от столкновения имен таблиц.