use*_*424 1 sql-server-2008 sql-server t-sql
我需要一些帮助来弄清楚如何将表连接到我的查询中。表名每天都在更改,因为表名中使用了日期,而旧表因不再需要而被删除。
我的查询查找在数据库中有数据并且正在处理的“扫描”(因为缺少更好的词)。
我目前的查询是:
USE RetinaCSDatabase
SELECT S.ScanID [Scan ID], S.PolicyName [Scan], DATEADD(hh, +2, S.StartTime) [Scan Start], A.AssetName [Scanner], COUNT(AIPS.AssetIPID) [Hosts], S.TransactionGroup [Transaction Group ID]
FROM Scan S (NOLOCK)
LEFT JOIN Scanner SC (NOLOCK) ON S.ScannerID = SC.ScannerID
LEFT JOIN Asset A (NOLOCK) ON SC.AssetID = A.AssetID
LEFT JOIN Asset_IP_Scan AIPS (NOLOCK) ON S.ScanID = AIPS.ScanID
WHERE S.ProcessStatus < 2
GROUP BY S.ScanID, S.PolicyName, S.StartTime, A.AssetName, S.TransactionGroup
ORDER BY S.StartTime ASC, S.PolicyName ASC, A.AssetName ASC
Run Code Online (Sandbox Code Playgroud)
我需要加入的是包含仍需要处理的数据的表。这些表以名称“evt_scan_”开头,然后是日期。因此,例如,完整的表名将是“evt_scan_20171222”。2017 年 12 月 22 日执行的扫描数据将在表“evt_scan_20171222”中包含数据,并且可能在接下来的几天表“evt_scan_20171223”中包含数据。所以,我首先需要我的查询来检查表是否存在,然后加入它进行计数并检查接下来的天表是否存在,加入它进行另一个计数并将 2 个计数相加以显示需要的未完成记录加工。
如果表名是静态的,我会用这个查询加入它们:
LEFT JOIN evt_scan_20171222 evt1 ON S.TransactionGroup = evt1.evtTransactionGroup
Run Code Online (Sandbox Code Playgroud)
它还需要一个 WHERE 语句,只返回 evtStatus = 0 的记录。
谢谢
使用同义词。
USE YourDatabaseName;
DECLARE @sql nvarchar(max) = N'CREATE SYNONYM
dbo.EventScan FOR dbo.evt_scan_'
+ CONVERT(CHAR(8), GETDATE(), 112);
EXEC sys.sp_executesql @sql;
Run Code Online (Sandbox Code Playgroud)
那么您的代码可以始终引用 dbo.EventScan。
现在,安排一个作业在每晚 12:00:01 AM 运行(或在表创建时创建 DDL 触发器,当新表名称与预期模式匹配时,或者将代码放入每天创建这些新表的任何内容中)这个:
USE YourDatabaseName;
DROP SYNONYM dbo.EventScan;
— repeat code from above
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3397 次 |
最近记录: |