Возвращает дату и время последней строки для всех таблиц в базе данных SQL Server

#sql #sql-server #datetime #qa #ssms-2016

#sql #sql-server #datetime #ssms-2016

Вопрос:

У меня есть база [database1] данных, в которой тысячи таблиц. В каждой таблице есть столбец даты / времени обновления вставки строки [EventDateTime] , не обязательно в качестве первичного ключа.

Я надеялся создать запрос, который создаст временную таблицу (или представление для печати) с двумя столбцами в ней; [TableName] amp; [LatestEventDateTime] .

Я думаю, что я мог бы использовать sp_MSforeachtable для извлечения данных, но я не уверен, как вызвать max [EventDateTime] для каждой таблицы.

Это был бы отличный запрос проверки для подтверждения обновления каждой таблицы.

Ответ №1:

Да, вы можете сделать это так:

 USE tempdb

IF OBJECT_ID(N'#temp') IS NOT NULL DROP TABLE #temp

CREATE TABLE #temp (
    TableName nvarchar(max),
    MaxEventDateTime datetime
)

USE YourDatabaseName

INSERT INTO #temp
exec sp_MSforeachtable 'SELECT ''?'', MAX([EventDateTime]) FROM ?'

SELECT *
FROM #temp
 

Примечание: sp_MSforeachtable это недокументированная хранимая процедура, и я не рекомендую использовать ее в жизненно важных производственных процессах.

Я предлагаю вам динамическое решение SQL:

 USE tempdb

IF OBJECT_ID(N'#temp') IS NOT NULL DROP TABLE #temp

CREATE TABLE #temp (
    TableName nvarchar(max),
    MaxEventDateTime INT
)

USE YourDatabaseName

DECLARE @sql nvarchar(max)

SELECT @sql = (
    SELECT 'INSERT INTO #temp SELECT ''' [name] ''', MAX([EventDateTime]) FROM ' QUOTENAME([name]) ';' CHAR(10)
    FROM sys.tables 
    FOR XML PATH('')
)

--PRINT @sql
EXEC sp_executesql @SQL
 

PRINT @sql приведет к такому запросу:

 USE [Test] INSERT INTO #temp SELECT 'TABLE_A', COUNT(*) FROM [TABLE_A];
USE [Test] INSERT INTO #temp SELECT 'TABLE_B', COUNT(*) FROM [TABLE_B];
USE [Test] INSERT INTO #temp SELECT 'TestXml', COUNT(*) FROM [TestXml];
USE [Test] INSERT INTO #temp SELECT 'Clients', COUNT(*) FROM [Clients];
 

Я советую вам использовать динамическое решение SQL.

Комментарии:

1. Я уверен, что первая отлично работает с небольшими базами данных, но, похоже, она навсегда работает с той, с которой я работал.

2. Вторая, похоже, вырезается на моем после 13,5 строк, что довольно глупо, учитывая размер nvarchar(max). Единственное, что меня беспокоит, это то, требует ли эта концепция выполнения сканирования всей базы данных. Что в моем случае сделало бы его совершенно бесполезным.

3. @DataMan31 Вы получаете 13,5 строк из-за PRINT , попробуйте выбрать часть между select @sql(<here to select>) ними и запустить ее. Вы увидите, что все строки находятся на своих местах.