Обрежьте все поля базы данных

Посмотрите на документацию для объекта запроса :

. Объект req является расширенной версией собственного объекта запроса Node и поддерживает все встроенные поля и методы .

blockquote>

Затем говорится, например:

При успешном запросе следующие события будут отправлены в следующем порядке:

  • 'socket '
  • ' response '
  • ' data 'любое количество раз на объекте res (' data 'вообще не будет отправлена, если тело ответа пусто, например, в большинстве перенаправляет)
  • 'end' на объекте res
  • 'close'
blockquote>

7
задан river0 3 February 2009 в 16:36
поделиться

8 ответов

Никакие курсоры. Скопируйте и вставьте вывод. Работы также для SQL 2000, который не имеет varchar (макс.). Это может быть легко расширено для добавления строки ДВИЖЕНИЯ в конец каждого ОБНОВЛЕНИЯ при желании.

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
21
ответ дан 6 December 2019 в 04:58
поделиться

цикл по information_schema.columns и RTRIM varchar/nvarchar столбцы путем создания оператора обновления динамично

3
ответ дан 6 December 2019 в 04:58
поделиться

Ваш вопрос немного неопределенен, но является этим, что Вы после?

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

Это удалит и продвижение и конечные пробелы от всех значений в 'mycolumn' столбце в 'mytable' таблице.

13
ответ дан 6 December 2019 в 04:58
поделиться

Если кто-либо знает, как сделать это без курсора, отправьте его:

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
3
ответ дан 6 December 2019 в 04:58
поделиться

Просто удостоверьтесь, что Вы делаете обрезку на строковых полях VARCHAR, не полях CHAR :)

Это не сделало бы много хорошего.

2
ответ дан 6 December 2019 в 04:58
поделиться

Спасибо, ребята,

Код Entaroadun работал вполне прилично на меня, я просто должен был сделать некоторые небольшие изменения к своему requierements, и также я должен был сбросить @colum_list на каждом повторении.

...
  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
...
0
ответ дан 6 December 2019 в 04:58
поделиться

- V Quick and Dirty!

- Если это нужно для генерации кода для работы с одной таблицей, запустите этот код с текстовым выводом;

установите nocount на

] объявить @table nvarchar (100) select @table = 'YourTableHere'

SELECT 'UPDATE' + @table + 'SET' SELECT '[' + Column_Name + '] =' + 'LTRIM (RTRIM ([' + Column_Name + '])),' FROM INFORMATION_SCHEMA.Columns ГДЕ Table_Name = @table И Data_Type, КАК '% CHAR%'

- Запускать как текстовый вывод (Запрос / Результаты в ... Результаты в текст - Скопируйте и вставьте вывод текста (за исключением последней запятой) в новое окно запроса и запустите его.

0
ответ дан 6 December 2019 в 04:58
поделиться

Хорошо, это было быстро и грязно, но я был достаточно мотивирован текущим проектом, чтобы сделать это правильно '- и без курсоров, но с небольшим трюком с конкатенацией sql. Хотя использует динамический sql:

--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
0
ответ дан 6 December 2019 в 04:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: