【问题标题】:SQL Server query to get the list of columns in a table along with Number, Data types, NOT NULL, and its sourceSQL Server 查询以获取表中的列列表以及数字、数据类型、NOT NULL 及其源
【发布时间】:2023-03-31 01:15:01
【问题描述】:

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

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

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 Server 2012。我做到了,但是另一个查询变得复杂,因为它缺少源(数据库+表名)...
  • 你可以运行EXEC sp_describe_first_result_set N'SELECT * FROM dbo.DimProduct', NULL, 1;

标签: sql-server types sql-server-2012 null


【解决方案1】:

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

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_ineachdbpart 1part 2)开始。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多