PushRecord_CreateTable.sql 7.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. -- 每月推送记录表(字段对应"每月推送模版表xlsx.xlsx",列名与数据库视图 V_WaterMetersAll 字段名一致)
  2. -- 数据库:Mul_AMRS_NBManager
  3. --
  4. -- 说明:本表为推送流水(追加写入,不更新/不删除历史)。防重粒度 = 水表编号 ElecAddress(空则 UserNo)
  5. -- + 抄表月份 ReadingMonth + 读数 NowReading + 抄表时间 NowRadingDT(即"读数版本")。
  6. -- 1) 同一读数版本本月已成功推过:重跑直接跳过,不重复上报;
  7. -- 2) 月内档案表读数更新(读数或抄表时间变化):视为新版本,再次推送并新增一条成功流水;
  8. -- 即同一块表同一个月允许存在多条成功记录,分别对应每次推送时的读数版本;
  9. -- 3) 推送失败:同样新增失败流水,下次执行按版本自动补传;
  10. -- 4) 因此表上【不建唯一索引】,仅保留普通查询索引。
  11. IF OBJECT_ID(N'dbo.PushRecord', N'U') IS NOT NULL
  12. DROP TABLE dbo.PushRecord;
  13. GO
  14. CREATE TABLE dbo.PushRecord
  15. (
  16. Id BIGINT IDENTITY(1,1) PRIMARY KEY, -- 自增主键
  17. UserNo NVARCHAR(50) NULL, -- 用户编号(对应V_WaterMetersAll.UserNo)
  18. UserName NVARCHAR(100) NULL, -- 用户名称(对应V_WaterMetersAll.UserName)
  19. totalAddr NVARCHAR(500) NULL, -- 用户地址(对应V_WaterMetersAll.totalAddr)
  20. ElecAddress NVARCHAR(50) NULL, -- 水表编号(对应V_WaterMetersAll.ElecAddress)
  21. PhoneNumber NVARCHAR(50) NULL, -- 用户手机号(对应V_WaterMetersAll.PhoneNumber)
  22. NowRadingDT DATETIME NULL, -- 实时推送日期/抄表日期(对应V_WaterMetersAll.NowRadingDT)
  23. ReadingMonth NVARCHAR(10) NULL, -- 抄表月yyyyMM(无对应数据库字段,由推送时间生成)
  24. NowReading INT NULL, -- 本地读数(对应V_WaterMetersAll.NowReading)
  25. UploadResult NVARCHAR(20) NULL, -- 上传结果(成功/失败)
  26. ResultMsg NVARCHAR(500) NULL, -- 接口返回信息
  27. UploadTime DATETIME NULL DEFAULT(GETDATE()), -- 记录写入时间
  28. Remark NVARCHAR(500) NULL -- 备注
  29. );
  30. GO
  31. -- 普通查询索引(按月统计、按用户查询;流水表不加唯一约束)
  32. -- 建议另建 (ReadingMonth, ElecAddress) 复合索引以加速程序启动时的已推送版本查询:
  33. CREATE INDEX IX_PushRecord_ReadingMonth ON dbo.PushRecord(ReadingMonth);
  34. CREATE INDEX IX_PushRecord_UserNo ON dbo.PushRecord(UserNo);
  35. CREATE INDEX IX_PushRecord_Month_Meter ON dbo.PushRecord(ReadingMonth, ElecAddress) INCLUDE (NowReading, NowRadingDT);
  36. GO
  37. -- 表及列注释(SQL Server 扩展属性)
  38. EXEC sp_addextendedproperty @name=N'MS_Description', @value=N'每月推送记录表(字段对应每月推送模版表,列名与数据库视图V_WaterMetersAll一致)', @level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'PushRecord';
  39. GO
  40. EXEC sp_addextendedproperty @name=N'MS_Description', @value=N'自增主键', @level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'PushRecord', @level2type=N'COLUMN', @level2name=N'Id';
  41. GO
  42. EXEC sp_addextendedproperty @name=N'MS_Description', @value=N'用户编号(对应V_WaterMetersAll.UserNo)', @level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'PushRecord', @level2type=N'COLUMN', @level2name=N'UserNo';
  43. GO
  44. EXEC sp_addextendedproperty @name=N'MS_Description', @value=N'用户名称(对应V_WaterMetersAll.UserName)', @level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'PushRecord', @level2type=N'COLUMN', @level2name=N'UserName';
  45. GO
  46. EXEC sp_addextendedproperty @name=N'MS_Description', @value=N'用户地址(对应V_WaterMetersAll.totalAddr)', @level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'PushRecord', @level2type=N'COLUMN', @level2name=N'totalAddr';
  47. GO
  48. EXEC sp_addextendedproperty @name=N'MS_Description', @value=N'水表编号(对应V_WaterMetersAll.ElecAddress)', @level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'PushRecord', @level2type=N'COLUMN', @level2name=N'ElecAddress';
  49. GO
  50. EXEC sp_addextendedproperty @name=N'MS_Description', @value=N'用户手机号(对应V_WaterMetersAll.PhoneNumber)', @level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'PushRecord', @level2type=N'COLUMN', @level2name=N'PhoneNumber';
  51. GO
  52. EXEC sp_addextendedproperty @name=N'MS_Description', @value=N'实时推送日期/抄表日期(对应V_WaterMetersAll.NowRadingDT)', @level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'PushRecord', @level2type=N'COLUMN', @level2name=N'NowRadingDT';
  53. GO
  54. EXEC sp_addextendedproperty @name=N'MS_Description', @value=N'抄表月yyyyMM(无对应数据库字段,由推送时间生成)', @level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'PushRecord', @level2type=N'COLUMN', @level2name=N'ReadingMonth';
  55. GO
  56. EXEC sp_addextendedproperty @name=N'MS_Description', @value=N'本地读数(对应V_WaterMetersAll.NowReading)', @level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'PushRecord', @level2type=N'COLUMN', @level2name=N'NowReading';
  57. GO
  58. EXEC sp_addextendedproperty @name=N'MS_Description', @value=N'上传结果(成功/失败)', @level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'PushRecord', @level2type=N'COLUMN', @level2name=N'UploadResult';
  59. GO
  60. EXEC sp_addextendedproperty @name=N'MS_Description', @value=N'接口返回信息', @level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'PushRecord', @level2type=N'COLUMN', @level2name=N'ResultMsg';
  61. GO
  62. EXEC sp_addextendedproperty @name=N'MS_Description', @value=N'记录写入时间', @level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'PushRecord', @level2type=N'COLUMN', @level2name=N'UploadTime';
  63. GO
  64. EXEC sp_addextendedproperty @name=N'MS_Description', @value=N'备注', @level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'PushRecord', @level2type=N'COLUMN', @level2name=N'Remark';
  65. GO
  66. -- ==========================================================================================
  67. -- 以下为【已按旧版本脚本建过 PushRecord 表】环境的增量升级脚本(幂等,可重复执行)。
  68. -- 全新库执行上面的建表语句即可,无需执行本段。
  69. -- ==========================================================================================
  70. -- 1) 旧表地址列名是 UserAddress,而程序写入列名为 totalAddr,需重命名修正(只改列名,数据保留)
  71. -- IF COL_LENGTH('dbo.PushRecord','totalAddr') IS NULL
  72. -- AND COL_LENGTH('dbo.PushRecord','UserAddress') IS NOT NULL
  73. -- EXEC sp_rename N'dbo.PushRecord.UserAddress', N'totalAddr', N'COLUMN';
  74. -- GO
  75. -- 2) 流水模式不再需要"成功行筛选唯一索引";若早期版本曾创建过,先删除(幂等)
  76. -- IF EXISTS (SELECT 1 FROM sys.indexes WHERE name = 'UX_PushRecord_Month_Meter_Success'
  77. -- AND object_id = OBJECT_ID('dbo.PushRecord'))
  78. -- DROP INDEX UX_PushRecord_Month_Meter_Success ON dbo.PushRecord;
  79. -- GO
  80. -- IF EXISTS (SELECT 1 FROM sys.indexes WHERE name = 'UX_PushRecord_Month_User_Success'
  81. -- AND object_id = OBJECT_ID('dbo.PushRecord'))
  82. -- DROP INDEX UX_PushRecord_Month_User_Success ON dbo.PushRecord;
  83. -- GO
  84. -- 3) 新增 (ReadingMonth, ElecAddress) 复合索引,加速程序启动时查询本月已推送读数版本(幂等)
  85. -- IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = 'IX_PushRecord_Month_Meter'
  86. -- AND object_id = OBJECT_ID('dbo.PushRecord'))
  87. -- CREATE INDEX IX_PushRecord_Month_Meter
  88. -- ON dbo.PushRecord(ReadingMonth, ElecAddress) INCLUDE (NowReading, NowRadingDT);
  89. -- GO