sql-server - 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
… … … … …
解决方案
对于单个数据库,很容易为所有表生成列表:
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
输出列有点没用,因为您已经知道您检索到的数据库、模式和表。
推荐阅读
- java - BigInteger 'multiplyToLen' 函数的解释
- tcp - Python Socket TCP 接收器未正确确认 NoOS LWIP 发送器
- apache-spark - 如何将数据框中的多个“字符串”列转换为日期时间列?
- python - 看似相同的代码给出不同的结果?
- c++11 - 每个接受左值引用的函数都应该重载以接受右值引用吗?
- python - 两种算法的效率比较:查找行/列排序矩阵中的负整数个数
- python - 仅读取文本文件中指定行中的数字
- python-3.x - 在不同文件夹中使用 pytest 测试项目
- python - Python 使用 While 循环和 For 循环
- sorting - 如何使用快速排序算法对包含 10,000 个元素的数组进行排序