Подтвердить что ты не робот

SQL Server: как выполнить Rtrim для всех столбцов varchar таблицы

У меня более 30 столбцов в моей таблице (sql server 2008). Тип столбцов - varchar (x). Я знаю, что в каждом столбце есть два дополнительных пробела в конце значения столбца. Как использовать функцию rtrim для всех столбцов и сохранить эту модификацию в этой существующей таблице?

Изменить: есть ли способ сделать это с помощью хранимой процедуры или курсора, где мне не нужно вручную объявлять все столбцы?

4b9b3361

Ответ 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'

И это избавит от столкновения имен таблиц.