How do I make truncate log script as dynamic SQL in SQL Server?

拟墨画扇 提交于 2021-01-28 21:16:20

问题


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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!