使用合并更新 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;
为了好玩,我决定编写代码列出所有 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;