2010-03-31 13 views
16

Mam ponad 30 kolumn w mojej tabeli (serwer sql 2008). Typy kolumn to varchar (x). Wiem, że w każdej kolumnie znajdują się dwie dodatkowe spacje na końcu wartości kolumny. Jak korzystać z funkcji Rtrim dla wszystkich kolumn i zapisać tę modyfikację w istniejącej tabeli?SQL Server: Jak wykonać Rtrim we wszystkich kolumnach varchar tabeli

Edycja: czy istnieje sposób, aby to zrobić za pomocą procedury przechowywanej lub kursora, gdzie nie muszę ręcznie deklarować wszystkich kolumn?

Odpowiedz

29

Dla ogólnego podejścia, można użyć skryptu tak, aby wygenerować oświadczenie dla ciebie, dla danej tabeli (przydatne, jeśli masz wiele kolumn!):

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 

który będzie po prostu wydrukuj instrukcję SQL. Możesz albo wtedy skopiować + uruchomić instrukcję, albo po prostu EXECUTE(@SQL). To jest niesprawdzone, więc po prostu spróbuj najpierw na stole testowym :)

+0

Lepiej jest mieć 'DATA_TYPE Like '% char%'' w przeciwnym razie możemy pominąć pola char i nchar datatype. – Shiva

+2

@Shiva - nie. Wartości CHAR i NCHAR są zawsze wypełnione białymi spacjami, więc nie byłoby to celowe. Można dołączyć NVARCHAR, ale pytania OP w szczególności dotyczyły VARCHARs – AdaTheDev

+0

@AdaTheDev - Right .. 'DATA_TYPE Jak '% varchar%'' byłoby w porządku. – Shiva

18
UPDATE xxx 
    SET col1 = RTRIM(col1), 
     col2 = RTRIM(col2), 
     col3 = RTRIM(col3), 
     ... 
1

Możemy mieć procedurę przechowywaną, aby przyciąć specific table pod specific schema. Jeśli mamy inne nazwy schematów inne niż domyślny schemat dbo, lepiej jest używać tego SP, przekazując nazwę schematu i nazwę tabeli. Wykonuje zarówno LTRIM i RTRIM. Ten SP sprawdzi kolumny 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 

ZASTOSOWANIE: [TrimAllColumnsOfTable] 'SchemaName','TableName'

0

Zaakceptowanych odpowiedź działa dobrze. Wystąpił problem z tabelą tymczasową o nazwie o tej samej nazwie. Możesz dodać

A to pozwoli pozbyć się kolizji na nazwach tabel.

1

Jest idealny ... Ale pamiętaj, aby umieścić również where klauzuli:

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

Ohterwise dostaniesz błąd, jeśli tabela ma kolumnę "%char%" komputerowej typu!

Powiązane problemy