只是为了好玩,我决定编写代码,其中列出了所有表以及今天已更新的记录数(使用SQL Server)。例如:
TableName ModifiedToday
table1 0
table2 5
table3 2
第一步是使用数据库中包含date_modified字段的所有表名创建一个临时表:
IF OBJECT_ID('tempdb..#temp') IS NOT NULL
DROP TABLE #temp
SELECT
t.name AS 'TableName'
,-1 AS 'ModifiedToday'
into #temp
FROM sys.columns c
JOIN sys.tables t ON c.object_id = t.object_id
WHERE c.name LIKE '%date_modified%'
ORDER BY TableName
接下来,我尝试根据表的内容对temp表执行更新。但是,我不熟悉COALESCE或SQL循环并难以使用表名进行更新。有什么想法吗?
DECLARE @tname varchar(200) = ''
WHILE ( SELECT COUNT(*) FROM #temp WHERE ModifiedToday = -1) >0
BEGIN
UPDATE #temp
SET @tname = TableName,
ModifiedToday = (COALESCE(CHAR(500), '') + 'SELECT COUNT(*) FROM '+ @tname + ' WHERE DATEDIFF(day,GETDATE(),isnull(date_modified,0)) = 0')
WHERE @tname = TableName
BREAK
END
答案 0 :(得分:0)
看看这是否对您有用-您可以将表名列表填充到临时表的SYSNAME列中,将表名列表插入表变量中,然后循环遍历表变量并执行一些动态sql从每个表中获取计数。
DECLARE @SQL NVARCHAR(MAX)
CREATE TABLE #temp ( TableName SYSNAME, ModifiedToday INT )
INSERT INTO #temp ( TableName, ModifiedToday )
SELECT
t.name AS 'TableName'
,-1 AS 'ModifiedToday'
FROM sys.columns c
JOIN sys.tables t ON c.object_id = t.object_id
WHERE c.name = 'date_modified' --changed this to '=' instead of 'LIKE' since you have the column name hard coded in the query below
DECLARE @SQLObjectList TABLE ( SQLObject sysname)
INSERT INTO @SQLObjectList( SQLObject) SELECT DISTINCT TableName FROM #temp WHERE ModifiedToday = -1
DECLARE @xSQLObject VARCHAR(1000)
WHILE EXISTS (SELECT 1 FROM @SQLObjectList)
BEGIN
SELECT TOP 1 @xSQLObject = SQLObject FROM @SQLObjectList
SET @SQL = 'UPDATE #temp SET ModifiedToday =
( SELECT COUNT(*) FROM '+@xSQLObject+' WHERE DATEDIFF(day,GETDATE(),isnull(date_modified,0)) = 0 )
WHERE TableName = '''+@xSQLObject+''' '
EXECUTE sp_executesql @SQL
DELETE FROM @SQLObjectList WHERE SQLObject = @xSQLObject
END
SELECT * FROM #temp;