使用Coalesce更新SQL /跟踪多个表中的更新记录

时间:2019-03-25 13:50:50

标签: sql sql-server sql-server-2008

只是为了好玩,我决定编写代码,其中列出了所有表以及今天已更新的记录数(使用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

1 个答案:

答案 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;