获取 SQL 表信息






4.20/5 (29投票s)
获取 SQL 表信息
引言
一个常见的需求是查看 SQL Server 数据库的表信息。 这里是查看 SQL 表信息的最简单方法。
输出图
背景
几天前,我的一个朋友问我为什么我们总是使用 ADO.NET 类库来获取任何 SQL 表信息在运行时! SQL Server 提供了几种“标准”技术来实现它。 所以我决定尝试一下,我发现它真的很酷,我相信尽可能使用 SQL Server 提供的标准技术总是更好的。
使用游标和动态 SQL 可以很容易地做到这一点,但在研究了“sp_ spaceused
”的工作方式以及 SMO 如何获取相同的信息后,我决定我可以不用这两种方法来编写它。
更好的是,一旦我写完它,我意识到它可以很容易地重写为一个存储过程。 现在我可以随时通过将它与其他表和视图连接起来,在新的查询或存储过程中重用它。
Using the Code
我使用了存储过程“sp_spaceused
”,它显示表、索引视图或服务代理队列在当前数据库中使用的行数、已保留的磁盘空间和已使用的磁盘空间,或者显示整个数据库已保留和使用的磁盘空间。 换句话说,这个存储过程计算用于数据和索引的磁盘空间量,以及当前数据库中表使用的磁盘空间。 下面给出了一个示例代码
/****** Object: StoredProcedure [dbo].[spTableInformation]
Script Date: 03/05/2009 21:33:26 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Md. Marufuzzaman>
-- Create date: <Create Date,,03/05/2009>
-- Description: <Description,,>
--Thanks to ,, RBarry Young
-- =============================================
CREATE PROCEDURE [dbo].[spTableInformation]
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
SELECT SCHEMA_NAME(SYSTBL.SCHEMA_ID) AS [SCHEMA], SYSTBL.NAME, COALESCE
((SELECT NAME
FROM sys.database_principals AS SDBP
WHERE (PRINCIPAL_ID = SYSTBL.PRINCIPAL_ID)), _
SCHEMA_NAME(SYSTBL.SCHEMA_ID)) AS OWNER, _
SYSTBL.MAX_COLUMN_ID_USED AS COLUMNS,
CAST(CASE SINDX_1.INDEX_ID WHEN 1 THEN 1 ELSE 0 END AS BIT) _
AS HASCLUSIDX, COALESCE
((SELECT SUM(rows)
FROM sys.partitions AS SPART
WHERE (OBJECT_ID = SYSTBL.OBJECT_ID) AND _
(INDEX_ID < 2)), 0) AS [ROWCOUNT], COALESCE
((SELECT CAST(SPTV.low / 1024.0 AS FLOAT)
* SUM(SAU_1.USED_PAGES - _
CASE WHEN SAU_1.TYPE <> 1 _
THEN SAU_1.USED_PAGES WHEN _
SYSP.INDEX_ID < 2 THEN _
SAU_1.DATA_PAGES
ELSE 0 END)
FROM sys.indexes AS SINDX_2 INNER JOIN
sys.partitions AS SYSP ON _
SYSP.OBJECT_ID = _
SINDX_2.OBJECT_ID _
AND SYSP.INDEX_ID = _
SINDX_2.INDEX_ID INNER JOIN
sys.allocation_units AS SAU_1 ON _
SAU_1.CONTAINER_ID = _
SYSP.PARTITION_ID
WHERE (SINDX_2.OBJECT_ID = SYSTBL.OBJECT_ID)), 0.0) _
AS INDEXKB, COALESCE
((SELECT CAST(SPTV.low / 1024.0 AS FLOAT)
* SUM(CASE WHEN SAU_2.TYPE <> 1 _
THEN SAU_2.USED_PAGES _
WHEN SYSP.INDEX_ID < 2 _
THEN SAU_2.DATA_PAGES ELSE 0 END)
AS Expr1
FROM sys.indexes AS SINDX_2 INNER JOIN
sys.partitions AS SYSP ON _
SYSP.OBJECT_ID = _
SINDX_2.OBJECT_ID _
AND SYSP.INDEX_ID = _
SINDX_2.INDEX_ID INNER JOIN
sys.allocation_units AS SAU_2 _
ON SAU_2.CONTAINER_ID = _
SYSP.PARTITION_ID
WHERE (SINDX_2.OBJECT_ID = SYSTBL.OBJECT_ID)), 0.0) _
AS DATAKB, SYSTBL.CREATE_DATE, SYSTBL.MODIFY_DATE
FROM sys.tables AS SYSTBL INNER JOIN
sys.indexes AS SINDX_1 ON SINDX_1.OBJECT_ID = SYSTBL.OBJECT_ID _
AND SINDX_1.INDEX_ID < 2 INNER JOIN
master.dbo.spt_values AS SPTV ON SPTV.NUMBER = 1 AND SPTV.type = 'E'
END
GO
结论
我希望本文对您有所帮助。 祝您愉快!
历史
- 2009 年 7 月 19 日:初始发布