2016-10-16 3 views
1

데이터베이스 내에 수천 개의 테이블이있는 [database1] 데이터베이스가 있습니다. 각 테이블에는 행 삽입 업데이트 날짜/시간 열 [EventDateTime]이 있으며 기본 키가 아닐 수도 있습니다.SQL Server 데이터베이스의 모든 테이블에 대한 최신 행 DateTime 반환

두 개의 열이있는 임시 테이블 (또는 인쇄보기)을 만드는 쿼리를 만들려고합니다. [TableName] & [LatestEventDateTime].

sp_MSforeachtable을 사용하여 데이터를 검색 할 수 있다고 생각하지만 각 테이블에 max [EventDateTime]을 호출하는 방법을 모르겠습니다.

이들은 모든 테이블이 업데이트되고 있음을 확인하는 훌륭한 검증 쿼리입니다.

도움이 될 것입니다.

감사합니다.

답변

0

예 당신이 그런 식으로 작업을 수행 할 수 있습니다

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]; 

I 조언 당신은 동적 SQL 솔루션을 사용 할 수 있습니다.

+0

나는 작은 데이터베이스에서 위대한 작품을 처음 만들 것이라고 확신하지만, 그 중 하나는 내가 함께 작업 한 것으로 보인다. – DataMan31

+0

두 번째 것은 13.5 줄 뒤에 잘라내는 것처럼 보입니다.이 줄은 nvarchar (max)의 크기가 다소 어리석은 것 같습니다. 내가 염려하는 유일한 것은이 개념이 전체 데이터베이스 스캔을 수행해야한다는 것입니다. 제 경우에는 그것을 완전히 쓸모 없게 만들 것입니다. – DataMan31

+0

@ DataMan31'PRINT' 때문에 13,5 줄이 생기면'select @sql (