首页 > 解决方案 > SQL Server 查询以获取表中的列列表以及数字、数据类型、NOT NULL 及其源

问题描述

我需要在 SQL 服务器上编写一个查询来获取特定表中的列列表,包括生成编号、其关联的数据类型(带长度)、它们是否为空(是,否则否),最后是它的源,包括数据库和表名。

例如,AdventureWorksDW从 table[dbo].[DimProduct]看,我可以看到:

CREATE TABLE [dbo].[DimProduct]
(
    [ProductKey] [INT] IDENTITY(1,1) NOT NULL,
    [ProductAlternateKey] [NVARCHAR](25) NULL,
    [ProductSubcategoryKey] [INT] NULL,
    [WeightUnitMeasureCode] [NCHAR](3) NULL,
    [SizeUnitMeasureCode] [NCHAR](3) NULL,
    [EnglishProductName] [NVARCHAR](50) NOT NULL,
    ...

我想创建一个选择语句来为我提供以下结果:

Number  Name                    Type            Is Null     Source
---------------------------------------------------------------------------------------------
1       ProductKey              int             No          AdventureWorksDW.dbo.DimProduct
2       ProductAlternateKey     nvarchar(25)    Yes         AdventureWorksDW.dbo.DimProduct
3       ProductSubcategoryKey   int             Yes         AdventureWorksDW.dbo.DimProduct
…       …                       …               …           …

标签: sql-servertypessql-server-2012null

解决方案


对于单个数据库,很容易为所有表生成列表:

SELECT 
  [Number] = f.column_ordinal, 
  Name = f.name, 
  [Type] = f.system_type_name, 
  [Is Null] = CASE f.is_nullable WHEN 1 THEN 'Yes' ELSE 'No' END,
  Source = QUOTENAME(DB_NAME()) + N'.' + QUOTENAME(s.name) + N'.' + QUOTENAME(t.name)
FROM sys.tables AS t 
INNER JOIN sys.schemas AS s
ON t.[schema_id] = s.[schema_id]
CROSS APPLY sys.dm_exec_describe_first_result_set
(
  N'SELECT * FROM ' + QUOTENAME(s.name) + N'.' + QUOTENAME(t.name),
  N'', 
  0
) AS f
ORDER BY Source, [Number];

如果您只需要一张桌子,请添加:

WHERE s.name = N'dbo'
  AND t.name = N'DimProduct'

...但是Source输出列有点没用,因为您已经知道您检索到的数据库、模式和表。

对于未知数量的未知名称的数据库,它有点复杂;您可以从sp_ineachdb第 1部分,第 2 部分)开始。


推荐阅读