위의 첫 번째 의견을 작성한 후이를 작성했지만 사양에 맞게 코드를 변경할 수 있어야합니다. 기본적으로 이것은 동적 SQL을 사용하여 필터 및 조건을 기반으로 명령을 생성합니다. 따라서 SELECT @SQL = ... 부분에서 원하는 조건을 사용하여 날짜를 확인한 다음 조건이 충족 될 때 테이블 이름을 추가 할 수 있습니다.
스크립트는 tablenames 및 drop 명령을 사용하여 목록을 반환하므로 수행하기 전에 수행중인 작업을 확인할 수 있습니다. 그러나 거기에서 드롭 명령 목록을 복사하고 원하는 경우 실행할 수 있습니다.
IF OBJECT_ID('tempdb..#TABLES') IS NOT NULL
DROP TABLE #TABLES
CREATE TABLE #TABLES (ROWNMBER INT IDENTITY(1,1), TABLENAME VARCHAR(256) COLLATE DATABASE_DEFAULT)
/*
-- Old code to fetch ALL tables with specified name
INSERT INTO #TABLES
SELECT name
FROM sys.tables
WHERE name LIKE 'table[_]%'
*/
-- Updated code to fetch only those tables which contain the DateStarted and DateFinished columns
INSERT INTO #TABLES
SELECT TAB.name
FROM sys.tables TAB
LEFT JOIN sys.columns C1 on C1.object_id = TAB.object_id
AND C1.name = 'DateStarted'
LEFT JOIN sys.columns C2 on C2.object_id = TAB.object_id
AND C2.name = 'DateFinished'
WHERE TAB.name LIKE 'table[_]%'
AND C1.name IS NOT NULL AND C2.name IS NOT NULL
IF OBJECT_ID('tempdb..#DROPPABLE_TABLES') IS NOT NULL
DROP TABLE #DROPPABLE_TABLES
CREATE TABLE #DROPPABLE_TABLES (TABLENAME VARCHAR(256) COLLATE DATABASE_DEFAULT)
DECLARE @ROW_NOW INT, @ROW_MAX INT, @SQL VARCHAR(MAX), @TABLENAME VARCHAR(256)
SELECT @ROW_NOW = MIN(ROWNMBER), @ROW_MAX = MAX(ROWNMBER) FROM #TABLES
WHILE @ROW_NOW <= @ROW_MAX
BEGIN
SELECT @TABLENAME = TABLENAME FROM #TABLES WHERE ROWNMBER = @ROW_NOW
SELECT @SQL =
'IF (SELECT COUNT(*) FROM '[email protected]+' WHERE DateStarted IS NOT NULL) > 0
AND (SELECT COUNT(*) FROM '[email protected]+' WHERE DateFinished IS NOT NULL) > 0
SELECT '''[email protected]+''''
INSERT INTO #DROPPABLE_TABLES
EXEC(@SQL)
SET @ROW_NOW = @ROW_NOW+1
END
SELECT *, 'DROP TABLE '+TABLENAME DROPCOMMAND FROM #DROPPABLE_TABLES
편집 :는 귀하의 의견에 따라 경찰, 그것은 모든 같은 테이블이 그 열이 보인다 . 다음 스크립트를 사용하여 해당 테이블과 누락 된 열을 식별 할 수 있으므로 더 자세히 확인할 수 있습니다. 그리고 동일한 아이디어를 사용하여 첫 번째 쿼리의 결과를 필터링하여 해당 열이있는 테이블에만 집계 할 수 있습니다.
SELECT TAB.name TABLENAME
, CASE WHEN C1.name IS NULL THEN 'Missing' ELSE '' END DateStarted_COL
, CASE WHEN C2.name IS NULL THEN 'Missing' ELSE '' END DateFinished_COL
FROM sys.tables TAB
LEFT JOIN sys.columns C1 on C1.object_id = TAB.object_id
AND C1.name = 'DateStarted'
LEFT JOIN sys.columns C2 on C2.object_id = TAB.object_id
AND C2.name = 'DateFinished'
WHERE TAB.name LIKE 'table[_]%'
AND (C1.name IS NULL
OR C2.name IS NULL)
테이블이므로 모든 * DateStarted 필드에 값이 있어야하고 * 모든 * DateFinished가 null이라는 것을 의미합니까? 또는 한 번에 하나의 행에 조건이 일치하거나 어떤 행에 두 조건이 일치하는 한 조건이 일치합니까? – Kahn
@Kahn Hi Kahn. DateStarted는 항상 존재해야합니다. DateFinished는 null이거나 값을 가질 수 있습니다. – alwaysVBNET
아래 답변. 필터 요구 사항을 충족시키기 위해 스크립트를 수정할 수 있어야합니다. 하지만 그렇지 않다면 나중에 물어 보겠습니다. :) – Kahn