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

Updating SQL with Coalesce / Tracking Updated Records in Multiple Tables

为了好玩,我决定编写代码列出所有 table 和今天更新的记录数(使用 SQL 服务器)。例如:

TableName   ModifiedToday

table1      0

table2      5

table3      2

第一步是创建一个临时文件 table,其中包含数据库中的所有 table 名称,其中包含 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

接下来,我尝试根据 table 的内容对临时 table 执行更新。但是,我不太熟悉 COALESCE 或在 SQL 中循环并努力使用 table 名称进行更新。有什么想法吗?

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

看看这是否适合您 - 您可以将 table 名称列表填充到临时 table 的 SYSNAME 列中,然后将 table 名称列表插入 table 变量,然后遍历 table 变量并执行一些动态 sql 以从每个 table.

中获取计数
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;