数据库中所有列的逗号分隔列表 (Tablename | Column_names...)

Posted

技术标签:

【中文标题】数据库中所有列的逗号分隔列表 (Tablename | Column_names...)【英文标题】:Comma Separated List of all columns in the Database (Tablename | Column_names...) 【发布时间】:2011-06-23 15:00:41 【问题描述】:

在 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      

我成功地垂直列出了列,但我无法获得逗号分隔的列列表。

【问题讨论】:

@OMG Ponies:我不明白为什么不这样做。如果他们给出了一个有趣的问题,并且您可以回答“这就是您这样做的方式:”,那么您为什么不呢?我知道它可以帮助我学习如何做一些事情来查看与我的问题域相关的示例。并非所有用户都想为另一个用户构建查询,但我不知道您为什么要尝试为社区发言并说“我们不这样做”。我个人喜欢通过提供有关他们正在处理的问题的查询来帮助人们。 (对不起,很长的一段,我不知道如何输入换行符......) @Jeremy Pridemore,我为什么要帮助那些希望我做他有报酬的工作的人?有人应该表明他们至少尝试过或正在询问他们需要知道什么才能开始尝试不直接要求其他人编写完整的代码。 我以为我发布了带有问题的代码,但我没有。我尝试用 Temp Tables 解决这个问题,并在问题下方发布了我不成功的代码。感谢您的所有 cmets 和支持。 【参考方案1】:

由于您的问题提到'在数据库中',我没有使用信息架构,而是使用了数据库:

select t.name, 
        STUFF ((
            select ',' + c.name
            from TEST_DB.sys.columns c
                join TEST_DB.sys.tables tt on tt.object_id = t.object_id and t.object_id = c.object_id
                join TEST_DB.sys.schemas s on tt.schema_id = s.schema_id
            order by t.name, c.column_id
            for xml path('')), 1, 1, '') as columns
from TEST_DB.sys.tables t
            where t.name = 'PutTableNameHere if you want to filter'

为特定数据库中的所有表保留 where 子句。

【讨论】:

【参考方案2】:
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

如 cmets 中所述,上面将包括视图。如果要排除视图,可以执行以下操作:

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

【讨论】:

+1 这很快。您应该知道,您的查询还会返回视图,而不仅仅是表。 @Lamak - 是的,是的。当然,它们很容易被排除在外。已发布该添加内容。 糟糕,... T.TABLE_NAME 为空的地方 @Nimrod - 几乎一写就更正了。 谢谢托马斯。我尝试使用临时表来解决这个问题,但没有成功。我在我的问题下方发布了我的代码。【参考方案3】:
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)

【讨论】:

谢谢马丁,我试图用临时表解决这个问题。但拿不到。我在问题下方发布了我的代码。

以上是关于数据库中所有列的逗号分隔列表 (Tablename | Column_names...)的主要内容,如果未能解决你的问题,请参考以下文章

在一列的列表中选择查询

比较来自两个不同表的两列的逗号分隔值

在逗号分隔的列表中查找经理

Excel:查找所有匹配值并放在逗号分隔列表中?

Mysql 使用逗号分隔列表 - 连接表

获取 Sql-Server 中逗号分隔值中未分组列的详细信息