2011-02-08 152 views
4

在SQL Server中,我希望看到Table_Name以及与该Table_Name在数据库中关联的所有列。所以输出应该是这样的:逗号分隔数据库中所有列的列表(Tablename | Column_names ...)

 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

我们没有建立它。 – 2011-02-08 18:10:43

+2

@OMG小马:我不明白为什么不。如果他们给出了一个有趣的问题,并且你可以用“这是你怎么做的:<代码片段>”来回答,那你为什么不呢?我知道它可以帮助我学习如何做一些事情来查看我的问题域的相关示例。 并非所有的用户都可能想为其他用户构建查询,但我不知道为什么要尝试为社区发言并说“我们不这样做”。我个人喜欢通过提供查询他们正在处理的问题来帮助人们。 (对不起长段落,我不知道如何输入换行符......) – 2011-02-08 23:47:12

+1

@Jeremy Pridemore,为什么我应该试图帮助那些希望我能够完成他所付出的工作的人?有人应该表明,他们至少已经尝试过或者在问他们需要知道什么,开始尝试不直接要求完成的代码以供其他人编写。 – HLGEM 2011-02-09 16:37:19

回答

13
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 
4
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)