Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL中的所有表和所有列?_Sql_Sql Server - Fatal编程技术网

SQL中的所有表和所有列?

SQL中的所有表和所有列?,sql,sql-server,Sql,Sql Server,我希望列出数据库中的每个表以及相应的列标题。SQL有没有办法做到这一点,并在这个过程中按字母顺序排列列名 以下格式行中的某些内容: Table1 Col1name Col2name Col3name ... Table2 Col1name Col2name Col3name ... ... 谢谢 SQL Server有一个名为的未记录存储过程,您可以使用它迭代数据库中的所有表 知道表名后,可以使用或查看表中的所有列 SELECT [schema] =

我希望列出数据库中的每个表以及相应的列标题。SQL有没有办法做到这一点,并在这个过程中按字母顺序排列列名

以下格式行中的某些内容:

Table1    Col1name    Col2name    Col3name ...
Table2    Col1name    Col2name    Col3name ...
...

谢谢

SQL Server有一个名为的未记录存储过程,您可以使用它迭代数据库中的所有表

知道表名后,可以使用或查看表中的所有列

SELECT 
  [schema] = s.name,
  [table]  = t.name, 
  [column] = c.name
FROM 
  sys.tables AS t
INNER JOIN
  sys.schemas AS s
  ON t.[schema_id] = s.[schema_id]
INNER JOIN 
  sys.columns AS c
  ON t.[object_id] = c.[object_id]
ORDER BY 
  t.name, 
  c.name;
这就是为什么我不会在SQL Server 2005+中对任何内容使用
信息\u模式的原因:


    • 这会让你朝着正确的方向前进。真正取决于您希望输出的方式:

      SELECT t.table_name, STUFF((SELECT distinct ',' + c.COLUMN_NAME 
                        FROM DATABASENAME.INFORMATION_SCHEMA.COLUMNS c WHERE c.TABLE_NAME =t.table_name
                  FOR XML PATH(''), TYPE
                  ).value('.', 'NVARCHAR(MAX)') 
              ,1,1,'') as Columns
      FROM  DATABASENAME.INFORMATION_SCHEMA.TABLES t 
      ORDER BY t.TABLE_NAME, Columns
      
      如果像@Aaron指出的那样使用sys.tables和sys.columns,那么这也应该起作用:

      SELECT t.name, STUFF((SELECT distinct ', ' + c.name
                        FROM sys.COLUMNS c WHERE t.object_id = c.object_id
                  FOR XML PATH(''), TYPE
                  ).value('.', 'NVARCHAR(MAX)') 
              ,1,1,'') as Columns
      FROM sys.TABLES t 
      ORDER BY t.name, Columns
      
      祝你好运。

      试试这个

          declare @xml as xml
          declare @max_cols int
          declare @i int
          declare @query as varchar(max)
          declare @query_OA2 as varchar(max)
      
          select @max_cols = MAX(n)
          from(   select COUNT(name) as n
                  from sys.columns
                  group by object_id
          )V
      
      
          select @i = 1, @query_OA2 = ''
          while @i <= @max_cols
          begin
              set @query_OA2 = @query_OA2 +', C.elements.value(''./name['+CAST(@i as varchar(max))+']'',''varchar(max)'') as [Column '+CAST(@i as varchar(max))+']'
              set @i = @i+1
          end
          select @query_OA2 = STUFF(@query_OA2,1,1,'')
      
          select @query = 'select t.name as [table]
                          ,OA2.*
                          from sys.tables t
                          outer apply (select (select (select c.name from sys.columns c
                                               where c.object_id = t.object_id
                                               order by c.column_id
                                               for xml path(''''),type) for xml path(''columns''),type) as cols
                          )OA
                          outer apply (select '+@query_OA2+'
                                       from OA.cols.nodes(''columns'')C(elements)
                          )OA2
                          order by t.name'
          exec (@query)
      

      做旋转动作

          declare @max_cols int
          declare @i int
          declare @query as varchar(max)
          declare @query2 as varchar(max)
      
          select @max_cols = MAX(n)
          from(   select COUNT(COLUMN_NAME) as n
              from INFORMATION_SCHEMA.COLUMNS
              group by table_name
          )V
      
      
          select @i = 1, @query2 = ''
          while @i <= @max_cols
          begin
              set @query2 = @query2 +', Col_'+CAST(@i as varchar(max))
              set @i = @i+1
          end
          select @query2 = STUFF(@query2,1,1,'')
      
          select @query =
          'select * 
          from (
                  select T.TABLE_NAME,T.COLUMN_NAME,''Col_''+cast(T.ORDINAL_POSITION as varchar(max)) as pos
                  from INFORMATION_SCHEMA.COLUMNS T
          )V
          PIVOT (max(V.COLUMN_NAME) for pos in ('+@query2+'))U'
      
          exec(@query)
      

      我肯定有很多类似这样的问题。您需要将每个列名放在单独的列中,而不是行中?为什么?每个表可能有不同数量的列,这使得按照需要生成有点困难。我建议在您的演示层进行转换。该过程没有文档记录,并且由于某种原因不受支持。:-)无论如何,在这种情况下,它没有多大用处,因为您将只是针对sys.columns或任何地方构建一个查询循环-当您可以使用更简单的连接来满足此查询,并且没有巫毒。仅供参考,我们的两个答案实际上都没有为每一列将列名放入一列中。还有一个很快就被弄糊涂的人。你还说了
      SCHEMA
      ,我想你的意思是
      INFORMATION\u SCHEMA
      。谢谢@AaronBertrand--我更新了使用信息\u SCHEMA:-)输入了我的实际值
          declare @max_cols int
          declare @i int
          declare @query as varchar(max)
          declare @query2 as varchar(max)
      
          select @max_cols = MAX(n)
          from(   select COUNT(COLUMN_NAME) as n
              from INFORMATION_SCHEMA.COLUMNS
              group by table_name
          )V
      
      
          select @i = 1, @query2 = ''
          while @i <= @max_cols
          begin
              set @query2 = @query2 +', Col_'+CAST(@i as varchar(max))
              set @i = @i+1
          end
          select @query2 = STUFF(@query2,1,1,'')
      
          select @query =
          'select * 
          from (
                  select T.TABLE_NAME,T.COLUMN_NAME,''Col_''+cast(T.ORDINAL_POSITION as varchar(max)) as pos
                  from INFORMATION_SCHEMA.COLUMNS T
          )V
          PIVOT (max(V.COLUMN_NAME) for pos in ('+@query2+'))U'
      
          exec(@query)
      
      TABLE_NAME              Col_1       Col_2       Col_3
      Veixxxxx                cd_exxx     cd_veixxx   nr_apxxxxxx
      Verxxxx                 cd_verxxx   de_verxxx   de_muxxxx