问题
I am using the below script to truncate the log files of a database. But I have to execute the below script results in separate window due to this I am not able to schedule the jobs .
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'
Expected O/P is script has to run instead of copy pasting the above query results
回答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
回答2:
You can achieve this with Dynamic SQL, without using a cursor
:
SET NOCOUNT ON
DECLARE @SQL VARCHAR(MAX) = ''
SELECT @SQL = @SQL +
'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'
PRINT (@SQL)
EXEC (@SQL)
Does the same thing...
来源:https://stackoverflow.com/questions/38792349/how-do-i-make-truncate-log-script-as-dynamic-sql-in-sql-server