separar por numero extraer ejemplos digitos delimitada comas coincidencias charindex caracteres caracter cadena buscar sql-server tsql

sql server - por - Recortar todos los campos de la base de datos



separar cadena delimitada por comas en sql server (9)

Si alguien sabe cómo hacer esto sin un cursor, publíquelo:

DECLARE @CRLF AS varchar(2) SET @CRLF = CHAR(13) + CHAR(10) DECLARE @TAB AS varchar(1) SET @TAB = CHAR(9) DECLARE @template AS varchar(max) SET @template = ''UPDATE {@OBJECT_NAME}'' + @CRLF + ''SET {@column_list}'' DECLARE c CURSOR FAST_FORWARD FOR SELECT DISTINCT QUOTENAME(T.TABLE_CATALOG) + ''.'' + QUOTENAME(T.TABLE_SCHEMA) + ''.'' + QUOTENAME(T.TABLE_NAME) AS [OBJECT_NAME] FROM INFORMATION_SCHEMA.TABLES AS T INNER JOIN INFORMATION_SCHEMA.COLUMNS AS C ON T.TABLE_CATALOG = C.TABLE_CATALOG AND T.TABLE_SCHEMA = C.TABLE_SCHEMA AND T.TABLE_NAME = C.TABLE_NAME AND T.TABLE_TYPE = ''BASE TABLE'' AND C.DATA_TYPE IN (''varchar'', ''nvarchar'') ORDER BY 1 DECLARE @OBJECT_NAME AS sysname OPEN c FETCH NEXT FROM c INTO @OBJECT_NAME WHILE @@FETCH_STATUS = 0 BEGIN DECLARE @column_list AS varchar(max) SELECT @column_list = COALESCE(@column_list + @CRLF + @TAB + '','', '''') + QUOTENAME(C.COLUMN_NAME) + '' = LTRIM(RTRIM('' + QUOTENAME(C.COLUMN_NAME) + ''))'' FROM INFORMATION_SCHEMA.COLUMNS AS C WHERE C.DATA_TYPE IN (''varchar'', ''nvarchar'') AND QUOTENAME(C.TABLE_CATALOG) + ''.'' + QUOTENAME(C.TABLE_SCHEMA) + ''.'' + QUOTENAME(C.TABLE_NAME) = @OBJECT_NAME ORDER BY C.ORDINAL_POSITION PRINT REPLACE(REPLACE(@template, ''{@column_list}'', @column_list), ''{@OBJECT_NAME}'', @OBJECT_NAME) FETCH NEXT FROM c INTO @OBJECT_NAME END CLOSE c DEALLOCATE c

¿Sabes si hay una forma rápida en el servidor sql (a través de transact-sql) que podría recortar todos los campos de cadena de la base de datos.


Sin cursores Copie y pegue la salida. Funciona también para SQL 2000, que no tiene varchar (max). Esto se puede extender fácilmente para agregar una línea GO al final de cada ACTUALIZACIÓN, si así lo desea.

SELECT SQL FROM ( SELECT t.TABLE_CATALOG , t.TABLE_SCHEMA , t.TABLE_NAME , 0 SORT , ''UPDATE '' + QUOTENAME(t.TABLE_CATALOG) + ''.'' + QUOTENAME(t.TABLE_SCHEMA) + ''.'' + QUOTENAME(t.TABLE_NAME) SQL FROM INFORMATION_SCHEMA.TABLES t JOIN INFORMATION_SCHEMA.COLUMNS c ON t.TABLE_CATALOG = c.TABLE_CATALOG AND t.TABLE_SCHEMA = c.TABLE_SCHEMA AND t.TABLE_NAME = c.TABLE_NAME WHERE t.TABLE_TYPE = ''BASE TABLE'' AND c.DATA_TYPE IN (''char'',''nchar'',''varchar'',''nvarchar'') GROUP BY t.TABLE_CATALOG , t.TABLE_SCHEMA , t.TABLE_NAME UNION ALL SELECT x.TABLE_CATALOG , x.TABLE_SCHEMA , x.TABLE_NAME , CASE WHEN x.COLUMN_NAME_MIN = y.COLUMN_NAME THEN 1 ELSE 2 END SORT , CASE WHEN x.COLUMN_NAME_MIN = y.COLUMN_NAME THEN ''SET '' ELSE '' , '' END + y.SQL SQL FROM ( SELECT t.TABLE_CATALOG , t.TABLE_SCHEMA , t.TABLE_NAME , MIN(c.COLUMN_NAME) COLUMN_NAME_MIN FROM INFORMATION_SCHEMA.TABLES t JOIN INFORMATION_SCHEMA.COLUMNS c ON t.TABLE_CATALOG = c.TABLE_CATALOG AND t.TABLE_SCHEMA = c.TABLE_SCHEMA AND t.TABLE_NAME = c.TABLE_NAME WHERE t.TABLE_TYPE = ''BASE TABLE'' AND c.DATA_TYPE IN (''char'',''nchar'',''varchar'',''nvarchar'') GROUP BY t.TABLE_CATALOG , t.TABLE_SCHEMA , t.TABLE_NAME ) x JOIN ( SELECT t.TABLE_CATALOG , t.TABLE_SCHEMA , t.TABLE_NAME , c.COLUMN_NAME , QUOTENAME(c.COLUMN_NAME) + '' = LTRIM(RTRIM('' + QUOTENAME(c.COLUMN_NAME) + ''))'' SQL FROM INFORMATION_SCHEMA.TABLES t JOIN INFORMATION_SCHEMA.COLUMNS c ON t.TABLE_CATALOG = c.TABLE_CATALOG AND t.TABLE_SCHEMA = c.TABLE_SCHEMA AND t.TABLE_NAME = c.TABLE_NAME WHERE t.TABLE_TYPE = ''BASE TABLE'' AND c.DATA_TYPE IN (''char'',''nchar'',''varchar'',''nvarchar'') ) y ON x.TABLE_CATALOG = y.TABLE_CATALOG AND x.TABLE_SCHEMA = y.TABLE_SCHEMA AND x.TABLE_NAME = y.TABLE_NAME ) x ORDER BY x.TABLE_CATALOG , x.TABLE_SCHEMA , x.TABLE_NAME , x.SORT , x.SQL


Solo asegúrate de hacer un ajuste en los campos de cadenas VARCHAR, no en los campos CHAR :)

Eso no haría mucho bien.


Su pregunta es un poco vaga, pero ¿es esto lo que busca?

UPDATE mytable SET mycolumn= LTRIM(RTRIM(mycolumn))

Esto eliminará los espacios iniciales y finales de todos los valores en la columna ''mycolumn'' en la tabla ''mytable''.


iterar sobre information_schema.columns y RTRIM las columnas varchar / nvarchar creando dinámicamente la instrucción de actualización


Gracias chicos,

El código Entaroadun funcionó bastante bien para mí, solo tuve que hacer algunos pequeños cambios en mis requisitos, y también tuve que restablecer @colum_list en cada iteración.

... PRINT REPLACE(REPLACE(@template, ''{@column_list}'', @column_list), ''{@OBJECT_NAME}'', @OBJECT_NAME) PRINT ''GO'' SELECT @column_list = null FETCH NEXT FROM c INTO @OBJECT_NAME ...


- V rápido y sucio!

- Si esto es para generar código para ejecutar en una sola tabla, ejecute este código con salida de texto;

establecer nocount en

declare @table nvarchar (100) seleccione @table = ''YourTableHere''

SELECCIONAR ''ACTUALIZAR'' + @table + ''SELECCIONAR'' SELECCIONAR ''['' + Nombre_columna + ''] ='' + ''LTRIM (RTRIM (['' + Nombre_columna + ''])),'' DESDE INFORMATION_SCHEMA.Columns WHERE Table_Name = @table AND Data_Type LIKE ''% CHAR%''

- Ejecutar como salida de texto (Consulta / Resultados a ... Resultados a texto - Copie y pegue la salida de texto (excluyendo la última coma) en una nueva ventana de consulta y ejecútela.


Se actualizó la respuesta de dan para usar todas las tablas en la base de datos. Simplemente ejecute el fragmento y copie el resultado para ejecutar.

SELECT ''UPDATE ['' + TABLE_SCHEMA + ''].['' + TABLE_NAME + ''] SET ['' + Column_Name + ''] = '' + ''LTRIM(RTRIM(['' + Column_Name + '']))'' FROM INFORMATION_SCHEMA.Columns c WHERE Data_Type LIKE ''%CHAR%''


OK, eso fue rápido y sucio, pero he estado suficientemente motivado por un proyecto actual para hacer esto "correctamente", y sin cursores, pero con un pequeño truco de concatenación sql. Utiliza sql dinámico sin embargo:

--exec spGenerateTrimStatements ''StaticImportMaturities'' ALTER PROCEDURE spGenerateTrimStatements ( @TableName NVARCHAR(100) ) AS DECLARE @Cr char(2), @OutputString nvarchar(max) SELECT @Cr = CHAR(13) + CHAR(10) SET NOCOUNT ON -- Create table to store commands CREATE TABLE #tOutput(OutputText nvarchar(500), RowID int identity(1,1)) -- Build up commands INSERT #tOutput(OutputText) SELECT ''UPDATE '' + @TableName + '' SET '' INSERT #tOutput(OutputText) SELECT ''['' + Column_Name + ''] = '' + ''LTRIM(RTRIM(['' + Column_Name + ''])), '' FROM INFORMATION_SCHEMA.Columns WHERE Table_Name = @TableName AND Data_Type LIKE ''%CHAR%'' -- Trim last comma UPDATE #tOutput SET OutputText = LEFT(OutputText, LEN(OutputText)-1) WHERE RowID = (SELECT Max(RowID) FROM #tOutput) -- use subselect to concatenate the command string SELECT @OutputString = ISNULL(@OutputString, '''') + ISNULL(OutputText, '''') FROM (SELECT OutputText FROM #tOutput) TextOutput -- run the command EXEC sp_ExecuteSQL @OutputString