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