• 【SqlServer】存储过程:批量查询数据库下表的元数据


    一、查询单张表

    1.1 根据表名查询表结构

    1. --快速查看表结构(比较全面的)
    2. DECLARE @tableName NVARCHAR(MAX);
    3. SET @tableName = N'YMUS'; --表名!!!
    4. SELECT CASE
    5. WHEN col.colorder = 1 THEN
    6. obj.name
    7. ELSE
    8. obj.name
    9. END AS 表名,
    10. col.colorder AS 序号,
    11. col.name AS 列名,
    12. ISNULL(ep.[value], '') AS 列说明,
    13. t.name AS 数据类型,
    14. col.length AS 长度,
    15. ISNULL(COLUMNPROPERTY(col.id, col.name, 'Scale'), 0) AS 小数位数,
    16. CASE
    17. WHEN COLUMNPROPERTY(col.id, col.name, 'IsIdentity') = 1 THEN
    18. '√'
    19. ELSE
    20. ''
    21. END AS 标识,
    22. CASE
    23. WHEN EXISTS
    24. (
    25. SELECT 1
    26. FROM dbo.sysindexes si
    27. INNER JOIN dbo.sysindexkeys sik
    28. ON si.id = sik.id
    29. AND si.indid = sik.indid
    30. INNER JOIN dbo.syscolumns sc
    31. ON sc.id = sik.id
    32. AND sc.colid = sik.colid
    33. INNER JOIN dbo.sysobjects so
    34. ON so.name = si.name
    35. AND so.xtype = 'PK'
    36. WHERE sc.id = col.id
    37. AND sc.colid = col.colid
    38. ) THEN
    39. '√'
    40. ELSE
    41. ''
    42. END AS 主键,
    43. CASE
    44. WHEN col.isnullable = 1 THEN
    45. '√'
    46. ELSE
    47. ''
    48. END AS 允许空,
    49. ISNULL(comm.text, '') AS 默认值
    50. FROM dbo.syscolumns col
    51. LEFT JOIN dbo.systypes t
    52. ON col.xtype = t.xusertype
    53. INNER JOIN dbo.sysobjects obj
    54. ON col.id = obj.id
    55. AND obj.xtype = 'U'
    56. AND obj.status >= 0
    57. LEFT JOIN dbo.syscomments comm
    58. ON col.cdefault = comm.id
    59. LEFT JOIN sys.extended_properties ep
    60. ON col.id = ep.major_id
    61. AND col.colid = ep.minor_id
    62. AND ep.name = 'MS_Description'
    63. LEFT JOIN sys.extended_properties epTwo
    64. ON obj.id = epTwo.major_id
    65. AND epTwo.minor_id = 0
    66. AND epTwo.name = 'MS_Description'
    67. WHERE obj.name = @tableName --表名
    68. ORDER BY col.colorder;

    1.2 存储过程封装

    1. IF OBJECT_ID('er1.export_result_records', 'P') IS NOT NULL
    2. DROP PROCEDURE er1.export_result_records;
    3. GO
    4. --快速查看表结构(比较全面的)
    5. CREATE PROCEDURE er1.export_result_records
    6. @tableName NVARCHAR(MAX)
    7. AS
    8. BEGIN
    9. DELETE FROM er1.a01_table_info WHERE CAST(表名 AS nvarchar(max)) = @tableName ;
    10. INSERT INTO er1.a01_table_info(表名,序号,列名,列说明,数据类型,长度,小数位数,标识,主键,允许空,默认值)
    11. SELECT CASE
    12. WHEN col.colorder = 1 THEN
    13. obj.name
    14. ELSE
    15. obj.name
    16. END AS 表名,
    17. col.colorder AS 序号,
    18. col.name AS 列名,
    19. ISNULL(ep.[value], '') AS 列说明,
    20. t.name AS 数据类型,
    21. col.length AS 长度,
    22. ISNULL(COLUMNPROPERTY(col.id, col.name, 'Scale'), 0) AS 小数位数,
    23. CASE
    24. WHEN COLUMNPROPERTY(col.id, col.name, 'IsIdentity') = 1 THEN
    25. '√'
    26. ELSE
    27. ''
    28. END AS 标识,
    29. CASE
    30. WHEN EXISTS
    31. (
    32. SELECT 1
    33. FROM dbo.sysindexes si
    34. INNER JOIN dbo.sysindexkeys sik
    35. ON si.id = sik.id
    36. AND si.indid = sik.indid
    37. INNER JOIN dbo.syscolumns sc
    38. ON sc.id = sik.id
    39. AND sc.colid = sik.colid
    40. INNER JOIN dbo.sysobjects so
    41. ON so.name = si.name
    42. AND so.xtype = 'PK'
    43. WHERE sc.id = col.id
    44. AND sc.colid = col.colid
    45. ) THEN
    46. '√'
    47. ELSE
    48. ''
    49. END AS 主键,
    50. CASE
    51. WHEN col.isnullable = 1 THEN
    52. '√'
    53. ELSE
    54. ''
    55. END AS 允许空,
    56. ISNULL(comm.text, '') AS 默认值
    57. FROM dbo.syscolumns col
    58. LEFT JOIN dbo.systypes t
    59. ON col.xtype = t.xusertype
    60. INNER JOIN dbo.sysobjects obj
    61. ON col.id = obj.id
    62. AND obj.xtype = 'U'
    63. AND obj.status >= 0
    64. LEFT JOIN dbo.syscomments comm
    65. ON col.cdefault = comm.id
    66. LEFT JOIN sys.extended_properties ep
    67. ON col.id = ep.major_id
    68. AND col.colid = ep.minor_id
    69. AND ep.name = 'MS_Description'
    70. LEFT JOIN sys.extended_properties epTwo
    71. ON obj.id = epTwo.major_id
    72. AND epTwo.minor_id = 0
    73. AND epTwo.name = 'MS_Description'
    74. WHERE obj.name = @tableName --表名
    75. ORDER BY col.colorder;
    76. END

    二、循环遍历所有表

    1. IF OBJECT_ID('er1.cursor_loop_achive_tbname', 'P') IS NOT NULL
    2. DROP PROCEDURE er1.cursor_loop_achive_tbname;
    3. GO
    4. CREATE PROCEDURE er1.cursor_loop_achive_tbname
    5. AS
    6. BEGIN
    7. SET NOCOUNT ON;
    8. DECLARE @table_name nvarchar(128),
    9. @sql nvarchar(max);
    10. -- 声明游标,并以系统表 sys.tables 作为查询对象
    11. DECLARE table_cursor CURSOR FOR
    12. SELECT name FROM sys.tables;
    13. -- 打开游标
    14. OPEN table_cursor;
    15. -- 依次遍历查询结果,将表名输出
    16. FETCH NEXT FROM table_cursor INTO @table_name;
    17. WHILE @@FETCH_STATUS = 0
    18. BEGIN
    19. EXEC [er1].[export_result_records] @tableName = @table_name
    20. FETCH NEXT FROM table_cursor INTO @table_name;
    21. END
    22. CLOSE table_cursor;
    23. DEALLOCATE table_cursor;
    24. END;

    三、存储过程调用

    1. -- 方式1
    2. USE [ER1]
    3. GO
    4. DECLARE @return_value int
    5. EXEC @return_value = [er1].[export_result_records]
    6. @tableName = N'YMUS'
    7. SELECT 'Return Value' = @return_value
    8. GO
    9. -- 方式2
    10. EXEC [er1].[export_result_records]
    11. @tableName = N'YMUS'
  • 相关阅读:
    限制LitstBox控件显示指定行数的最新数据(1/3)
    分布式技术之dubbo
    Qt国际化翻译解决方案
    关于butterfly主题
    代码随想录算法训练营:17/60
    服务器连接时间长了,忘记密码,解密密码
    一张图进阶 RocketMQ - NameServer
    C++新经典 | C++ 查漏补缺(内存)
    如何通过Navicat导入sql文件
    Flutter 生成小程序的混合 App 实践
  • 原文地址:https://blog.csdn.net/USTSD/article/details/133983338