2016-08-05 25 views
1

Ich verwende das folgende Skript, um die Protokolldateien einer Datenbank zu kürzen. Aber ich muss die folgenden Skript-Ergebnisse in einem separaten Fenster ausführen, deshalb kann ich die Jobs nicht planen.Wie mache ich abschneiden Log-Skript als dynamische SQL in SQL Server?

SET NOCOUNT ON 

SELECT 
     'USE [' + d.name + N']' + CHAR(13) + CHAR(10) 
    + 'DBCC SHRINKFILE (N''' + mf.name + N''' , 0, TRUNCATEONLY)' 
    + CHAR(13) + CHAR(10) + CHAR(13) + CHAR(10) 
FROM 
     sys.master_files mf 
    JOIN sys.databases d 
     ON mf.database_id = d.database_id 
WHERE d.database_id > 4 and mf.type_desc = 'LOG' 

Erwartete O/P-Skript statt Kopie auszuführen hat die obige Abfrage einfügen Ergebnisse

+1

Eine Alternative zum dynamischen SQL ist SQL Server Wartungspläne zu verwenden. Jeder Plan ist ein SSIS-Paket, das vom SQL-Agenten zu einem festgelegten Zeitpunkt ausgeführt wird. Hier ist ein Link zu den [MS Docs] (https://msdn.microsoft.com/en-us/library/ms187658.aspx). –

+0

Wenn Sie keine Wartungspläne verwenden können ... Suchen Sie etwas so einfaches wie [sp_executesql] (https://msdn.microsoft.com/en-us/library/ms188001.aspx)? Sie würden dies in Verbindung mit einem Cursor verwenden. – SMM

Antwort

1
SET NOCOUNT ON 

DECLARE @LOG TABLE (
    QUERY varchar(max) 
) 
DECLARE @QUERY varchar(max) 

INSERT INTO @LOG 
    SELECT 
    'USE [' + d.name + N']' + CHAR(13) + CHAR(10) 
    + 'DBCC SHRINKFILE (N''' + mf.name + N''' , 0, TRUNCATEONLY)' 
    + CHAR(13) + CHAR(10) + CHAR(13) + CHAR(10) 
    FROM sys.master_files mf 
    JOIN sys.databases d 
    ON mf.database_id = d.database_id 
    WHERE d.database_id > 4 
    AND mf.type_desc = 'LOG' 


DECLARE C CURSOR FOR 
SELECT 
    QUERY 
FROM @LOG 
OPEN C 
FETCH NEXT FROM C INTO @QUERY 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    PRINT @QUERY 
    EXEC (@QUERY) 
    FETCH NEXT FROM C INTO @QUERY 
END 
CLOSE C 
DEALLOCATE C 
+0

Hallo, ich kann nicht abstimmen, aber Ranjana Ghimire Script hat für mich funktioniert. Danke Ranjana. – SNR

+0

Gern geschehen. kein Problem mit der Wahl. Ich bin froh, dass ich dir helfen konnte. –

+0

bitte markieren Sie diese Frage als beantwortet (ohne Abstimmung), um Menschen zu helfen, wenn sie dieses Thema nicht suchen – Hadi