SQL Server: как заменить разрывы строк в текстовых полях? - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть следующий SQL

SELECT COLUMN_NAME
FROM Information_Schema.Columns
WHERE TABLE_NAME = 'TABLE'
  AND DATA_TYPE = 'varchar'
ORDER BY COLUMN_NAME

Возвращает:

    COLUMN_NAME
    -------------------
    CiudadConductor
    CiudadPropietario
    CodBaseLegal
    DireccConductor
    DireccPropietario
    PTActa
    PTClase
    PTCodCategoriaClase
    PTCodCIP
    PTCodiConductor 

С помощью этого SQL мне нужно идентифицировать varchar столбцы, которые существуют, но я хочу сделатьобновление данных.

Я знаю, что этот SQL заменяет, но как мне заставить эти два оператора SQL работать вместе.

REPLACE(ColumnName, CHAR(13),'') 

Я хочу удалить разрывы строк во всех varchar столбцах

Ответы [ 2 ]

1 голос
/ 26 апреля 2019

Это должно работать (не проверено), однако, PRINT поможет вам, если, возможно, немного «выключено»:

DECLARE @SQL nvarchar(MAX),
        @Table sysname = N'T700InfracTrans';


SET @SQL = N'UPDATE ' + QUOTENAME(@Table) + NCHAR(13) + NCHAR(10) + 
           N'SET ' + STUFF((SELECT N',' + NCHAR(13) + NCHAR(10) + 
                                   N'    ' + QUOTENAME(COLUMN_NAME) + N' = REPLACE(REPLACE(' + QUOTENAME(COLUMN_NAME) + N',CHAR(13),''''),CHAR(10),'''')'


                            FROM INFORMATION_SCHEMA.COLUMNS
                            WHERE TABLE_NAME = @Table
                              AND DATA_TYPE = N'varchar'
                            ORDER BY COLUMN_NAME
                            FOR XML PATH(''),TYPE).value('.','nvarchar(MAX)'),1,7,N'') + N';';

PRINT @SQL; --Your debugging best friend.
--EXEC sp_executesql @SQL; --Uncomment to execute
0 голосов
/ 26 апреля 2019

Попробуйте это

DECLARE @SqlTab TABLE(ID INT IDENTITY(1, 1) NOT NULL PRIMARY KEY, SQL NVARCHAR(MAX) NOT NULL)
DECLARE @TableName sysname = 'TableName'

     INSERT INTO @SqlTab(Sql)
        SELECT
            SQL = 'UPDATE ' + QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) + ' SET ' + QUOTENAME(COLUMN_NAME) + ' = REPLACE(REPLACE(' + COLUMN_NAME + ', CHAR(13), ''''), CHAR(10), '''') '
        FROM
            INFORMATION_SCHEMA.COLUMNS
        WHERE
            TABLE_NAME = @TableName --<-- Remove if you want to strip out CRLF in All Tables
            AND DATA_TYPE IN('VARCHAR')
        ORDER BY
            TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME   

     DECLARE @ID INT = -1, @Sql NVARCHAR(MAX)
     WHILE(1 = 1)
        BEGIN
            SELECT
                @ID = ID
                ,@Sql = Sql
            FROM 
                @SqlTab
            WHERE
                ID > @ID

            IF @@ROWCOUNT = 0 BREAK
            --PRINT @Sql
            EXEC SP_ExecuteSql @Sql
        END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...