Разделенный запятыми список всех столбцов в базе данных (Tablename | Column_names ...) - PullRequest
8 голосов
/ 08 февраля 2011

В SQL Server я хотел бы видеть Table_Name и все столбцы, связанные с этим Table_Name в базе данных. Поэтому вывод должен выглядеть следующим образом:

      TABLE_NAME     COLUMN_NAME 

   1. Employee       Employee-id, Lastname, Firstname, Title...........
   2. Orders         Orderid, Order-date, shipped-date, delivery-date.......
   3. Products       Product-id, Product-name, supplier-id, category-id.....
   4. Suppliers      Supplier-id, Company-name, contact-name.......
   5. ............................................................
   6. ...................................................
      (So on....)

Можно ли получить вышеуказанные результаты с помощью WHILE LOOP или любым другим способом? Если ДА, не могли бы вы опубликовать код.

Кроме того, я попытался решить эту проблему, используя временную таблицу:

 create table #hello
 (table_name1 Varchar(max))
  insert into #hello(table_name1)
  select table_name from information_schema.columns 
 GO

 create table #hello2
 (table_name2 varchar(max),column_name2 varchar(max))
  insert into #hello2(table_name2 ,column_name2)
  select table_name,column_name from information_schema.columns 
 GO

 select  a.table_name1,b.column_name from #hello a inner join
   information_schema.columns b
 on a.table_name1=b.table_name COLLATE Latin1_general_CI_AS
 order by table_name 
 GO      

Мне удалось перечислить столбцы по вертикали, но я не смог получить список столбцов через запятую.

Ответы [ 2 ]

19 голосов
/ 08 февраля 2011
Select TABLE_SCHEMA, TABLE_NAME
    , Stuff(
        (
        Select ', ' + C.COLUMN_NAME
        From INFORMATION_SCHEMA.COLUMNS As C
        Where C.TABLE_SCHEMA = T.TABLE_SCHEMA
            And C.TABLE_NAME = T.TABLE_NAME
        Order By C.ORDINAL_POSITION
        For Xml Path('')
        ), 1, 2, '') As Columns
From INFORMATION_SCHEMA.TABLES As T

Как уже упоминалось в комментариях, выше будет включать в себя представления. Если вы хотите исключить просмотры, вы можете сделать следующее:

Select T.TABLE_SCHEMA, T.TABLE_NAME
    , Stuff(
        (
        Select ', ' + C.COLUMN_NAME
        From INFORMATION_SCHEMA.COLUMNS As C
        Where C.TABLE_SCHEMA = T.TABLE_SCHEMA
            And C.TABLE_NAME = T.TABLE_NAME
        Order By C.ORDINAL_POSITION
        For Xml Path('')
        ), 1, 2, '') As Columns
From INFORMATION_SCHEMA.TABLES As T
    Left Join INFORMATION_SCHEMA.VIEWS As V
        On V.TABLE_SCHEMA = T.TABLE_SCHEMA
            And V.TABLE_NAME = T.TABLE_NAME
Where V.TABLE_NAME Is Null
6 голосов
/ 08 февраля 2011
select name as TABLE_NAME,
       STUFF(COLUMN_NAME, 1, 1, '') AS COLUMN_NAME
from sys.tables t
CROSS APPLY 
( 
        SELECT 
            ',' + name AS [text()] 
        FROM 
            sys.columns c
        WHERE 
            c.object_id = t.object_id
        FOR XML PATH('') 
    ) o (COLUMN_NAME)
...