经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MS SQL Server » 查看文章
【SqlServer】存储过程:批量查询数据库下表的元数据
来源:cnblogs  作者:哥们要飞  时间:2023/10/23 9:42:28  对本文有异议

一、查询单张表

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'

 

原文链接:https://www.cnblogs.com/liujinhui/p/17781707.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号