TSQL преобразует значения строк в одну таблицу столбцов

Исходная таблица

Col1  |Col2  |Col3  |Col4  | Col5
----------------------------------
 hi   | this | is   | a    | test

Таблица назначения

RowValues|
----------
hi
this
is
a
test

Я использую динамический SQL. Любая помощь ?

Это мой код, просто измените имя таблицы и идентификатор в предложении where на то, что вам подходит.

DECLARE @sql nVARCHAR(max), @TableName  nvarchar(100), @where nvarchar(max)
set @TableName = 'stockItems'

set @where= ' where id = 2'
select @sql  ='Select '
select  @sql = @sql+  + ' '''+ [name] +' = ''+ cast(' + [name]  + ' as nvarchar(10)) as '+[name]+',  ' 
         from sys.columns where object_name (object_id) = @TableName


set @sql = stuff(@sql, len(@sql), 1, '')  +  ' From '+@TableName+ @where
print @sql
set @sql = REPLACE(@sql,',   From',' From')
set @sql = @sql + '  '
print @sql
exec(@sql) 

Теперь мне нужно создать новую таблицу, в которой есть один столбец, содержащий каждое значение в виде строки.

Благодаря @Mahmoud-Gamal Решение должно быть примерно таким, как показано ниже.

declare @cols nvarchar(max)
select @cols = STUFF((SELECT distinct ',' +
                        QUOTENAME(column_name)
                      FROM information_schema.columns
                      WHERE table_name = 'vehicles' 
                      FOR XML PATH(''), TYPE
                     ).value('.', 'NVARCHAR(MAX)') 
                        , 1, 1, '');
declare @statement nvarchar(max)
set @statement ='
SELECT
    ColumnName,  Value
FROM
    Vehicles
UNPIVOT
    (
    Value
    FOR ColumnName
    IN
        (
        '+@cols+'
        )
    )
    AS A'

    execute(@statement)

Пожалуйста, измените имя таблицы «транспортное средство» на любую таблицу в вашей базе данных, которая имеет столбцы разных типов (datetime, int и nvarchar), и отображается приведенная ниже ошибка. Любая помощь? Тип столбца "Описание" конфликтует с типом других столбцов, указанных в списке UNPIVOT.


person James Dayeh    schedule 04.09.2013    source источник


Ответы (2)


Используйте оператор таблицы UNPIVOT:

SELECT col AS RowValues
FROM table1 AS t
UNPIVOT
(
  col
  FOR value IN([col1], 
               [col2], 
               [col3],
              [col4],
              [col5])
) AS u;

Это даст вам:

| ROWVALUES |
|-----------|
|        hi |
|      this |
|        is |
|         a |
|      test |

Обновлять:

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

Но проблема в том, как получить имена столбцов?

Вы можете получить имена столбцов из information_schema.columns, затем объединить их в один sql, затем заменить имена столбцов в UNPIVOT этой строкой и выполнить этот оператор динамически следующим образом:

DECLARE @cols AS NVARCHAR(MAX);
DECLARE @query AS NVARCHAR(MAX);

select @cols = STUFF((SELECT distinct ',' +
                        QUOTENAME(column_name)
                      FROM information_schema.columns
                      WHERE table_name = 'Table1'
                      FOR XML PATH(''), TYPE
                     ).value('.', 'NVARCHAR(MAX)') 
                        , 1, 1, '');

SELECT @query = ' SELECT col AS RowValues
                  FROM table1 AS t
                  UNPIVOT
                  (
                  val
                  FOR col IN ( ' + @cols + ' )
                  ) AS u;';

EXECUTE(@query);
person Mahmoud Gamal    schedule 04.09.2013
comment
Я не знаю названия столбцов! Пожалуйста, проверьте мой код, я отредактировал вопрос - person James Dayeh; 04.09.2013
comment
Спасибо за ваш ответ. Сейчас я использую unpivot, однако я не могу преобразовать все столбцы в определенный тип. Я получаю следующую ошибку: Тип идентификатора столбца конфликтует с типом других столбцов, указанных в списке UNPIVOT. - person James Dayeh; 04.09.2013
comment
@JamesDayeh Где находится ID, я его не вижу, преобразуйте его в тот же тип, что и другие столбцы varchar, например: CAST(Id AS VARCHAR(50)) - person Mahmoud Gamal; 04.09.2013
comment
@JamesDayeh - Как я уже сказал, вы должны привести все столбцы к одному типу данных, см. это обновленная демонстрация скрипки sql - person Mahmoud Gamal; 04.09.2013
comment
@JamesDayeh - Если вам нужны только имена столбцов, почему бы просто не сделать: SELECT distinct QUOTENAME(column_name) FROM information_schema.columns WHERE table_name = 'Vehicles' как в эта демонстрация скрипки - person Mahmoud Gamal; 04.09.2013
comment
Я не знаю названия столбцов. Я собираюсь заменить таблицу «Транспортные средства» на @tableName. Пример в скрипте JS показывает col1, col2 (где происходит преобразование). Я делаю его универсальным. Любая идея, как сделать преобразование, не зная имен столбцов? - person James Dayeh; 04.09.2013
comment
@JamesDayeh - Если вы ищете из этого только имена столбцов, почему бы просто не использовать запрос SELECT distinct QUOTENAME(column_name) FROM information_schema.columns WHERE table_name = 'Vehicles' напрямую? и каждый раз заменять table_name переменной? - person Mahmoud Gamal; 04.09.2013
comment
довольно странно, у вас есть программа просмотра команд, чтобы я мог объяснить? - person James Dayeh; 04.09.2013
comment
@JamesDayeh - Да, есть - person Mahmoud Gamal; 04.09.2013
comment
пользователь 612 352 332 пройти 6873 - person James Dayeh; 04.09.2013
comment
@JamesDayeh - я решил эту проблему, создав динамический оператор sql для динамической записи преобразования для всех столбцов, см. эта обновленная демонстрация скрипки sql, попробуйте и дайте мне знать, эта инструкция sql имеет имя @selectedcols в этой демонстрации - person Mahmoud Gamal; 04.09.2013
comment
Замечательно (у) Большое спасибо, Махмуд. :Д:Д:Д:Д - person James Dayeh; 04.09.2013
comment
@JamesDayeh - добро пожаловать в любое время :) Если вам нужно что-то еще в любое время, не стесняйтесь спрашивать, удачи :) И удалите комментарий к имени пользователя и паролю для просмотра команды, чтобы никто его не видел :) - person Mahmoud Gamal; 04.09.2013

Я верю, ты хочешь этого

Select Col1 + Col2 + Col3 + Col4 + Col5 From Table

Или может быть после

Select Col1 From Table1
 union Select Col2 From Table1 
 union Select Col3 From Table1
 union Select Col4 From Table1 
 union Select Col5 From Table1 ;
person Dhaval    schedule 04.09.2013
comment
так ты правильно ответил? если да, пожалуйста, разместите его в разделе ОТВЕТЫ и ПРИНИМАЙТЕ его - person Dhaval; 04.09.2013