#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 строк из-за
select @sql(<here to select>)
ними и запустить ее. Вы увидите, что все строки находятся на своих местах.