SQL Server: как выполнить Rtrim для всех столбцов таблицы varchar - PullRequest
19 голосов
/ 31 марта 2010

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

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

Ответы [ 5 ]

33 голосов
/ 31 марта 2010

Для общего подхода вы можете использовать такой скрипт, чтобы сгенерировать для вас инструкцию для данной таблицы (полезно, если у вас много столбцов!):

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).Это не проверено, поэтому сначала попробуйте на тестовой таблице:)

20 голосов
/ 31 марта 2010
UPDATE xxx
  SET col1 = RTRIM(col1),
      col2 = RTRIM(col2),
      col3 = RTRIM(col3),
      ...
1 голос
/ 19 января 2016

Это прекрасно ... Но не забудьте поставить также where предложение:

COLUMNPROPERTY(OBJECT_ID(TABLE_SCHEMA+'.'+TABLE_NAME),COLUMN_NAME,'IsComputed') = 0

В противном случае вы получите ошибку, если в таблице есть вычисляемый столбец типа "%char%"!

1 голос
/ 05 марта 2015

Мы можем сохранить хранимую процедуру для обрезки 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'

0 голосов
/ 08 июля 2015

Принятый ответ работает хорошо. Я столкнулся с проблемой, когда временная таблица была названа с тем же именем. Вы можете добавить

and TABLE_SCHEMA = 'dbo'

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...