유용한 쿼리문 MSSQL - 2

반응형

(1) 해당 DB의 모든 테이블 SELECT, SELECT COUNT(*), DROP, TRUNCATE, DELETE 쿼리 만들기

DECLARE @v_SQL NVARCHAR(MAX)
DECLARE @v_Params NVARCHAR(1000)
DECLARE @v_Process NVARCHAR(50)
DECLARE @v_DBName SYSNAME


SET @v_Process = N'DELETE FROM' -- 'SELECT * FROM', 'SELECT COUNT(*) FROM', 'DROP TABLE', 'TRUNCATE TABLE', 'DELETE FROM'
SET @v_DBName = DB_NAME()


SET @v_SQL = N'USE ' + @v_DBName + CHAR(10)
SET @v_SQL = @v_SQL + N'SELECT @v_InProcess + '' '' + @v_InDBName + ''.'' + a.f_SchemaName + ''.'' + a.f_ObjectName
FROM
(
    SELECT object_id AS f_ObjectID, SCHEMA_NAME(schema_id) AS f_SchemaName, (CASE type WHEN ''V'' THEN ''VIEW'' WHEN ''U'' THEN ''TABLE'' END) AS f_ObjectType, name AS f_ObjectName, CONVERT(VARCHAR(23), create_date, 121) AS f_CrDate, CONVERT(VARCHAR(23), modify_date, 121) AS f_ModDate   
    FROM sys.objects
    WHERE type IN(''U'', ''V'') 
) AS a
LEFT OUTER JOIN sys.extended_properties AS p 
ON a.f_ObjectID = p.major_id AND p.minor_id = 0 AND p.name = ''MS_Description''
ORDER BY a.f_SchemaName ASC, a.f_ObjectType ASC, a.f_ObjectName ASC'


SET @v_Params = N'@v_InProcess NVARCHAR(50), @v_InDBName SYSNAME'


EXECUTE SP_EXECUTESQL @v_SQL, @v_Params, @v_InProcess = @v_Process, @v_InDBName = @v_DBName

 

(2) 모든 테이블의 SELECT 필드 쿼리 만들기

DECLARE @v_DBName SYSNAME


SET @v_DBName = DB_NAME()


SELECT ('SELECT ' + a.COLUMNNAMES + ' FROM ' + @v_DBName + '.' + a.SCHEMANAME + '.' + a.TABLENAME) AS Query
FROM
(
    SELECT SCHEMANAME, TABLENAME,
    STUFF((
        SELECT ', ' + [name]
        FROM sys.columns
        WHERE object_id = t.object_id
        ORDER BY column_id ASC
        FOR XML PATH('')
), 1, 2, '') AS COLUMNNAMES 
    FROM 
    (
        SELECT object_id, SCHEMA_NAME(schema_id) AS SCHEMANAME, [name] AS TABLENAME
        FROM sys.objects
        WHERE type IN('U', 'V')
    ) AS t
    GROUP BY t.object_id, t.SCHEMANAME, t.TABLENAME
) AS a

 

(3) 최근에 수정된 저장프로시저 ALTER PROCEDURE 쿼리 만들기

DECLARE @v_SQL NVARCHAR(MAX)
DECLARE @v_ExecParam NVARCHAR(200)
DECLARE @v_CreateDate NCHAR(10)
DECLARE @v_ModifyDate NCHAR(10)
DECLARE @v_ObjectName NVARCHAR(50) 


DECLARE @v_TblSPContent TABLE(
    SPContent NVARCHAR(MAX)
)


SET @v_CreateDate = CONVERT(CHAR(10), GETDATE() - 1, 23)
SET @v_ModifyDate = CONVERT(CHAR(10), GETDATE() - 1, 23)


DECLARE cur CURSOR FAST_FORWARD FOR


-- 저장프로시저 명세
SELECT name 
FROM sys.procedures
WHERE create_date >= @v_CreateDate OR modify_date >= @v_ModifyDate
ORDER BY modify_date DESC


OPEN cur


FETCH NEXT FROM cur INTO @v_ObjectName
WHILE @@FETCH_STATUS = 0
BEGIN
    -- 해당 저장프로시져 내용
    SET @v_SQL = 'sp_helptext @v_InObjectName'
    SET @v_ExecParam = '@v_InObjectName VARCHAR(100)'
    
    INSERT @v_TblSPContent(SPContent)
    EXEC SP_EXECUTESQL @v_SQL, @v_ExecParam, @v_InObjectName = @v_ObjectName


    FETCH NEXT FROM cur INTO @v_ObjectName
END


CLOSE cur
DEALLOCATE cur


SELECT REPLACE(SPContent, 'CREATE PROCEDURE', 'ALTER PROCEDURE') 
FROM @v_TblSPContent

 

(4) 모든 인덱스 삭제 쿼리 만들기

DECLARE @v_TblSPContent TABLE(
    SQLContent NVARCHAR(MAX)
)


DECLARE @v_SchemaName NVARCHAR(256)
DECLARE @v_TableName NVARCHAR(256)
DECLARE @v_IndexName NVARCHAR(256)
DECLARE @v_IsPrimaryKey TINYINT 
DECLARE @v_SQL VARCHAR(MAX)


DECLARE Cur CURSOR FOR
 
SELECT SCHEMA_NAME(t.schema_id), t.name, ind.name, ind.is_primary_key
FROM sys.indexes AS ind
INNER JOIN sys.tables AS t 
ON t.object_id = ind.object_id
WHERE ind.[type] > 0 AND t.is_ms_shipped = 0 AND t.name <> 'sysdiagrams'
ORDER BY SCHEMA_NAME(t.schema_id) ASC, t.name ASC


OPEN Cur


FETCH NEXT FROM Cur INTO @v_SchemaName, @v_TableName, @v_IndexName, @v_IsPrimaryKey
WHILE @@FETCH_STATUS = 0
BEGIN
    IF @v_IsPrimaryKey = 1
        SET @v_SQL = 'ALTER TABLE ' + QUOTENAME(@v_SchemaName) + '.' + QUOTENAME(@v_TableName) + ' DROP CONSTRAINT ' + QUOTENAME(@v_IndexName)
    ELSE
        SET @v_SQL = 'DROP INDEX ' + QUOTENAME(@v_SchemaName) + '.' + QUOTENAME(@v_TableName) + '.' + QUOTENAME(@v_IndexName)


    INSERT @v_TblSPContent(SQLContent)
    SELECT @v_SQL


    FETCH NEXT FROM Cur INTO @v_SchemaName, @v_TableName, @v_IndexName, @v_IsPrimaryKey
END


CLOSE Cur
DEALLOCATE Cur 


SELECT SQLContent FROM @v_TblSPContent

 

(5) 모든 인덱스 생성 쿼리 만들기

DECLARE @v_SchemaName NVARCHAR(256)
DECLARE @v_TableName NVARCHAR(256)
DECLARE @v_IndexName NVARCHAR(256)
DECLARE @v_ColumnName NVARCHAR(100)
DECLARE @v_IsPrimaryKey TINYINT 
DECLARE @v_IsUnique NVARCHAR(100)
DECLARE @v_IndexTypeDesc NVARCHAR(100)
DECLARE @v_FileGroupName NVARCHAR(100)
DECLARE @v_IsDisabled NVARCHAR(100)
DECLARE @v_IndexOptions NVARCHAR(MAX)
DECLARE @v_IndexColumnId TINYINT
DECLARE @v_IsDescendingKey TINYINT 
DECLARE @v_IsIncludedColumn TINYINT
DECLARE @v_TSQLScripCreationIndex NVARCHAR(MAX)
DECLARE @v_TSQLScripDisableIndex NVARCHAR(MAX)


DECLARE Cur01 CURSOR FOR
 
SELECT SCHEMA_NAME(t.schema_id) AS [SCHEMA_NAME], t.name, ind.name, ind.is_primary_key,
CASE WHEN ind.is_unique = 1 THEN 'UNIQUE ' ELSE '' END, 
ind.type_desc,
(CASE WHEN ind.is_padded = 1 THEN 'PAD_INDEX = ON, ' ELSE 'PAD_INDEX = OFF, ' END + 
CASE WHEN INDEXPROPERTY(t.object_id, ind.name, 'IsStatistics') = 1 THEN 'STATISTICS_NORECOMPUTE = ON, ' ELSE 'STATISTICS_NORECOMPUTE = OFF, ' END +
'SORT_IN_TEMPDB = OFF, ' +
CASE WHEN ind.ignore_dup_key = 1 THEN 'IGNORE_DUP_KEY = ON, ' ELSE 'IGNORE_DUP_KEY = OFF, ' END +
CASE WHEN ind.allow_row_locks = 1 THEN 'ALLOW_ROW_LOCKS = ON, ' ELSE 'ALLOW_ROW_LOCKS = OFF, ' END + 
CASE WHEN ind.allow_page_locks = 1 THEN 'ALLOW_PAGE_LOCKS = ON' ELSE 'ALLOW_PAGE_LOCKS = OFF' END + 
CASE WHEN ind.fill_factor > 0 THEN ', FILLFACTOR = ' + CAST(ind.fill_factor AS NVARCHAR(3)) ELSE '' END 
) AS IndexOptions, 
ind.is_disabled, FILEGROUP_NAME(ind.data_space_id) FileGroupName
FROM sys.tables AS t 
INNER JOIN sys.indexes AS ind 
ON t.object_id = ind.object_id
WHERE ind.[type] > 0
AND t.is_ms_shipped = 0 AND t.name <> 'sysdiagrams'
ORDER BY SCHEMA_NAME(t.schema_id) ASC, t.name ASC, ind.name ASC


OPEN Cur01
FETCH NEXT FROM Cur01 INTO @v_SchemaName, @v_TableName, @v_IndexName, @v_IsPrimaryKey, @v_IsUnique, @v_IndexTypeDesc, @v_IndexOptions, @v_IsDisabled, @v_FileGroupName


WHILE @@FETCH_STATUS = 0
BEGIN
    DECLARE @v_IndexColumns NVARCHAR(MAX)
    DECLARE @v_IncludedColumns NVARCHAR(MAX)
 
    SET @v_IndexColumns = ''
    SET @v_IncludedColumns = ''
 
    DECLARE Cur02 CURSOR FOR


    SELECT col.name, indcol.is_descending_key, indcol.is_included_column
    FROM sys.tables AS t 
    INNER JOIN sys.indexes AS ind 
    ON t.object_id = ind.object_id
    INNER JOIN sys.index_columns AS indcol 
    ON ind.object_id = indcol.object_id AND ind.index_id = indcol.index_id
    INNER JOIN sys.columns col 
    ON indcol.object_id = col.object_id AND indcol.column_id = col.column_id
    WHERE ind.[type] > 0 AND (ind.is_primary_key = 0 OR ind.is_unique_constraint = 0)
    AND SCHEMA_NAME(t.schema_id) = @v_SchemaName 
    AND t.name = @v_TableName 
    AND ind.name = @v_IndexName
    ORDER BY indcol.index_column_id
 
    OPEN Cur02 
    FETCH NEXT FROM Cur02 INTO @v_ColumnName, @v_IsDescendingKey, @v_IsIncludedColumn
 
    WHILE @@FETCH_STATUS = 0
    BEGIN
        IF @v_IsIncludedColumn = 0 
            SET @v_IndexColumns = @v_IndexColumns + @v_ColumnName + CASE WHEN @v_IsDescendingKey = 1 THEN ' DESC, ' ELSE ' ASC, ' END
       ELSE 
           SET @v_IncludedColumns = @v_IncludedColumns + @v_ColumnName + ', ' 


        FETCH NEXT FROM Cur02 INTO @v_ColumnName, @v_IsDescendingKey, @v_IsIncludedColumn
    END


    CLOSE Cur02
    DEALLOCATE Cur02


    SET @v_IndexColumns = SUBSTRING(@v_IndexColumns, 1, LEN(@v_IndexColumns) - 1)
    SET @v_IncludedColumns = CASE WHEN LEN(@v_IncludedColumns) > 0 THEN SUBSTRING(@v_IncludedColumns, 1, LEN(@v_IncludedColumns) - 1) ELSE '' END


    SET @v_TSQLScripCreationIndex = ''
    SET @v_TSQLScripDisableIndex = ''


    IF @v_IsPrimaryKey = 1
    BEGIN
        SET @v_TSQLScripCreationIndex = 'ALTER TABLE ' + QUOTENAME(@v_SchemaName) + '.' + QUOTENAME(@v_TableName) + ' ADD CONSTRAINT ' + QUOTENAME(@v_IndexName) + ' PRIMARY KEY'  
+ CHAR(13) + '(' + CHAR(13) + CHAR(9) + @v_IndexColumns + CHAR(13) + ')' 
+ CASE WHEN LEN(@v_IncludedColumns) > 0 THEN CHAR(13) + 'INCLUDE (' + @v_IncludedColumns + ')' ELSE '' END + ' WITH (' + @v_IndexOptions + ') ON ' + QUOTENAME(@v_FileGroupName)  
    END
    ELSE
    BEGIN
        SET @v_TSQLScripCreationIndex = 'CREATE ' + @v_IsUnique + @v_IndexTypeDesc + ' INDEX ' + QUOTENAME(@v_IndexName) + ' ON ' + QUOTENAME(@v_SchemaName) + '.' + QUOTENAME(@v_TableName) 
+ CHAR(13) + '(' + CHAR(13) + CHAR(9) + @v_IndexColumns + CHAR(13) + ')' 
+ CASE WHEN LEN(@v_IncludedColumns) > 0 THEN CHAR(13) + 'INCLUDE (' + @v_IncludedColumns + ')' ELSE '' END + ' WITH (' + @v_IndexOptions + ') ON ' + QUOTENAME(@v_FileGroupName)  
    END


    IF @v_IsDisabled = 1 
        SET @v_TSQLScripDisableIndex = CHAR(13) + 'ALTER INDEX ' + QUOTENAME(@v_IndexName) + ' ON ' + QUOTENAME(@v_SchemaName) + '.' + QUOTENAME(@v_TableName) + ' DISABLE' + CHAR(13) 


    PRINT @v_TSQLScripCreationIndex
    PRINT @v_TSQLScripDisableIndex


    FETCH NEXT FROM Cur01 INTO  @v_SchemaName, @v_TableName, @v_IndexName, @v_IsPrimaryKey, @v_IsUnique, @v_IndexTypeDesc, @v_IndexOptions,@v_IsDisabled, @v_FileGroupName
END


CLOSE Cur01
DEALLOCATE Cur01
 
 
반응형