Обновление SQL с помощью Coalesce / Tracking обновленных записей в нескольких таблицах - PullRequest
0 голосов
/ 25 марта 2019

Ради интереса я решил написать код, в котором перечислены все таблицы и количество записей, которые были обновлены сегодня (с использованием 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

Далее я пытаюсь выполнить обновление временной таблицы на основе содержимого таблиц. Тем не менее, я не так хорошо знаком с 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 голосов
/ 25 марта 2019

Посмотрите, работает ли это для вас - вы можете заполнить список имен таблиц в столбце 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...