Отображение всех текстовых полей в одном столбце для всех таблиц SQL - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь объединить все столбцы текстового поля в один столбец для каждой строки и каждой таблицы в базе данных.Я сделал это для указанной таблицы, но я хотел бы сделать это для всех таблиц.

Вот что у меня есть:

DECLARE @YourTableName   varchar(1000)
DECLARE @YourColumns     varchar(max)
DECLARE @YourQuery       varchar(max)
SET @YourTableName='COUNTRY'
SELECT
    @YourColumns=STUFF(
       (SELECT
            '+ ''$$'' +'
            + CASE
                  WHEN DATA_TYPE IN ('varchar','nvarchar','text','ntext','char','nchar') THEN '''' + [COLUMN_NAME] + '@@'' + ' + 'COALESCE(CONVERT(varchar(max),' + CONVERT(varchar(max),COLUMN_NAME)+'),''NULL'')'
              END
            FROM INFORMATION_SCHEMA.COLUMNS
            WHERE table_name = @YourTableName
            FOR XML PATH('')
       ), 1, 2, ''
      )
SET @YourQuery  = 'SELECT '+@YourColumns+' FROM '+@YourTableName
EXEC (@YourQuery)

И мой вывод будет примерно таким:

$$COUNTRY_NAME@@United States of America$$COUNTRY_CODE@@USA...
$$COUNTRY_NAME@@United Kingdom$$COUNTRY_CODE@@GBR...
$$COUNTRY_NAME@@France$$COUNTRY_CODE@@FRA...
...

Я установил имя таблицы и хочу выполнить эту работу для каждой таблицы в базе данных, БЕЗ указания каждого имени таблицы.

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

В основном вы можете попробовать использовать любой из следующих трех методов:

  1. Использование курсора для итерации каждой таблицы, в некоторых случаях это аналогично пункту 3 ниже, но можетвызвать проблему с производительностью.

  2. Использование динамического SQL для построения @AllTables VARCHAR(MAX), но это приведет к одной проблеме: если общая длина всех ваших таблиц превысит 8000, это не будет точным.

  3. Использование временной таблицы для итерации каждой таблицы.

    CREATE TABLE #TEMP
     (
        TABLENAME VARCHAR(500),
       [COUNTER] INT IDENTITY(1,1)
     )
    
     INSERT INTO #TEMP
     SELECT name
     FROM sys.tables
    
    
    DECLARE @YourTableName   varchar(1000)
    DECLARE @YourColumns     varchar(max)
    DECLARE @YourQuery       varchar(max)
    DECLARE @Control         int = 1
    
    WHILE (@Control <= (SELECT MAX([COUNTER]) FROM #TEMP))
    
    BEGIN
        SELECT @YourTableName = TABLENAME
        FROM #TEMP
        WHERE [COUNTER] = @Control
    
    SELECT
        @YourColumns=STUFF(
                       (SELECT
                            '+ ''$$'' +'
                            + CASE
                                  WHEN DATA_TYPE IN ('varchar','nvarchar','text','ntext','char','nchar') THEN '''' + [COLUMN_NAME] + '@@'' + ' + 'COALESCE(CONVERT(varchar(max),' + CONVERT(varchar(max),COLUMN_NAME)+'),''NULL'')'
                              END
                            FROM INFORMATION_SCHEMA.COLUMNS
                            WHERE table_name = @YourTableName
                            FOR XML PATH('')
                       ), 1, 2, ''
                      )
    
    SET @YourQuery  = 'SELECT '+@YourColumns+' FROM '+@YourTableName
    PRINT @YourQuery
    --EXEC (@YourQuery)
    SET @Control = @Control + 1
    
    END
    
0 голосов
/ 08 июня 2018

M.Eedan,

Вы можете попробовать использовать курсор, как показано ниже:

DECLARE @YourTableName   varchar(1000)
DECLARE @YourColumns     varchar(max)
DECLARE @YourQuery       varchar(max)

DECLARE table_cursor CURSOR FOR

    SELECT name FROM SYS.tables WHERE TYPE = 'U'

OPEN table_cursor
FETCH NEXT FROM table_cursor INTO @YourTableName

WHILE @@FETCH_STATUS = 0
BEGIN

    SELECT
        @YourColumns=STUFF(
                           (SELECT
                                '+ ''$$'' +'
                                + CASE
                                      WHEN DATA_TYPE IN ('varchar','nvarchar','text','ntext','char','nchar') THEN '''' + [COLUMN_NAME] + '@@'' + ' + 'COALESCE(CONVERT(varchar(max),' + CONVERT(varchar(max),COLUMN_NAME)+'),''NULL'')'
                                  END
                                FROM INFORMATION_SCHEMA.COLUMNS
                                WHERE table_name = @YourTableName
                                FOR XML PATH('')
                           ), 1, 2, ''
                          )
    SET @YourQuery  = 'SELECT '+@YourColumns+' FROM '+@YourTableName
    EXEC (@YourQuery)
    FETCH NEXT FROM table_cursor INTO @YourTableName
END
CLOSE table_cursor   
DEALLOCATE table_cursor

Это даст вам отдельные наборы данных на таблицу.Имейте в виду, что вы можете превысить максимальный размер типа данных в больших строках и усечение опыта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...