2010-03-31 14 views
16

Tengo más de 30 columnas en mi tabla (servidor sql 2008). El tipo de columnas son varchar (x). Sé que en cada columna hay dos espacios adicionales al final del valor de la columna. ¿Cómo usar la función rtrim para todas las columnas y guardar esta modificación en esta tabla existente?SQL Server: Cómo realizar Rtrim en todas las columnas varchar de una tabla

Edición: ¿hay alguna manera de hacerlo utilizando el procedimiento almacenado o el cursor donde no tengo que declarar manualmente todas las columnas?

Respuesta

29

Para un enfoque genérico, se puede utilizar un script como el siguiente para generar la declaración de que, para una tabla determinada (útil si tiene muchas columnas!):

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 

que la voluntad simplemente imprime la instrucción SQL. Puede entonces copiar + ejecutar la declaración, o simplemente EXECUTE(@SQL). Esto no se ha probado, así que simplemente pruébalo primero en una tabla de prueba :)

+0

Es mejor tener 'DATA_TYPE Like '% char%'' de lo contrario, podemos perder los campos de tipo de datos char y nchar. – Shiva

+2

@Shiva - no. Los valores de CHAR y NCHAR siempre se rellenan con espacios en blanco, por lo que no serviría de nada. NVARCHAR podría incluirse, pero las preguntas de OP estaban específicamente alrededor de VARCHARs – AdaTheDev

+0

@AdaTheDev - Derecha .. 'DATA_TYPE Like '% varchar%'' estaría bien. – Shiva

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

Podemos tener el procedimiento almacenado para recortar specific table bajo specific schema. Si tenemos diferentes nombres de esquema que no sean el esquema predeterminado dbo, es mejor usar este SP pasando el nombre del esquema y el nombre de la tabla. Esto realiza tanto LTRIM como RTRIM. Este SP verificaría char, nchar, varchar, nvarchar columnas.

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 

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

0

La respuesta aceptada funciona bien. Me encontré con un problema con una tabla temporal que se llamaba con el mismo nombre. Puede agregar

and TABLE_SCHEMA = 'dbo' 

Y eso eliminará la colisión en los nombres de las tablas.

1

Es perfecto ... Pero recuerda poner también la cláusula de where:

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

ohterwise obtendrá un error si la tabla tiene una columna calculada de "%char%" tipo!

Cuestiones relacionadas