2016-08-18 3 views
0

Учитывая таблицу, например:Соединить столбцы и строки

Таблица Person:

id, name, last_name, age 

1, joshua, smith, 33 
2, melissa, fox, 65 
3, james, bond, 31 
... 

я должен прочитать каждую строку из таблицы, получить текущую строку, CONCAT его имени столбца и значения, а затем , наконец, положить их в другую таблицу в виде новых строк. Например:

Колонка concat_row (VARCHAR) в новой таблице:

"name: joshua, last_name: smith, age: 33" 
"name: melissa, last_name: fox, age: 65" 
"name: james, last_name: bond, age: 31" 
... 

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

+0

Как правило, что-то вроде 'select * to newtable from yourtable' было бы достаточно. Однако, если вы не знаете столбцы и хотите объединить их в один столбец, вам нужно будет использовать 'dynamic sql' с некоторой функцией' concat' (в зависимости от вашей базы данных). – sgeddes

+0

Если вы используете SQL Server, проверьте [FOR XML] (https://msdn.microsoft.com/en-AU/library/ms178107.aspx) – cha

+0

Пометьте используемые dbms. Возможно, можно использовать некоторые функциональные возможности продукта. В противном случае динамический SQL - это мой номер один. – jarlh

ответ

0

Вы можете использовать ниже SQL и расширить его согласно вашей потребности,

USE AdventureWorks2014 

DECLARE @OwnerName VARCHAR(50) 
DECLARE @TblName VARCHAR(50) 

SET @OwnerName = 'Sales' 
SET @TblName = 'Customer' 

DECLARE @Columns VARCHAR(MAX) 

SET @Columns = '' 

SELECT @Columns = @Columns + ('''' + Column_Name + ':'' + ISNULL(convert(VARCHAR(MAX),' + Column_Name + '),'''') + '', '' + ') 
FROM (
    SELECT * 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = @TblName 
    ) A 

--PRINT @Columns 

DECLARE @FinalSelect VARCHAR(max) 

SELECT @FinalSelect = 'Select ' + LEFT(@Columns, LEN(@Columns) - 10) + ' Contact_Row From ' + @OwnerName + '.' + @TblName 

--print @FinalSelect 
EXEC (@FinalSelect) 

И выход (Top 5 строк),

CustomerID: 1, PersonID :, StoreID: 934 , TerritoryID: 1, AccountNumber: AW00000001, ROWGUID: 3F5AE95E-B87D-4AED-95B4-C3797AFCB74F, ModifiedDate: 12 сен 2014 11:15 утра CustomerID: 2, PersonID :, StoreID: 1028, TerritoryID: 1, AccountNumber: AW00000002, r owguid: E552F657-A9AF-4A7D-A645-C429D6E02491, ModifiedDate: 12 сентября 2014 11:15 утра CustomerID: 3, PersonId :, StoreID: 642, TerritoryID: 4, AccountNumber: AW00000003, ROWGUID: 130774B1-DB21-4EF3- 98C8-C104BCD6ED6D, ModifiedDate: 12 сентября 2014 11:15 утра CustomerID: 4, PersonId :, StoreID: 932, TerritoryID: 4, AccountNumber: AW00000004, ROWGUID: FF862851-1DAA-4044-BE7C-3E85583C054D, ModifiedDate: 12 сен 2014 11:15 утра CustomerID: 5, PersonID :, StoreID: 1026, TerritoryID: 4, AccountNumber: AW00000005, ROWGUID: 83905BDC-6F5E-4F71-B162-C98DA069F38A, ModifiedDate: 12 сен 2014 11:15 утра

+0

Это именно то, что я хотел! Я протестировал его, внеся некоторые изменения (чтобы адаптировать его к моей схеме, запросам котировок и именам таблиц), и она работала просто красиво. Один мой друг сказал мне, что я должен доверять этому сайту. Такс снова человек. – Ges

+0

@Ges, Рад помочь, В любое время ... Сделайте голосование. Так что другие могут также использовать один и тот же набор. – Lucky

+0

может быть, потому что я новичок здесь, они не позволяют мне давать голосование в формате UP (+1), я отметил проверку принятия ответа, но я не знаю, как это сделать. , – Ges

Смежные вопросы