반응형

cursor 문에 조건문을 넣고 싶은 경우가 있다.

그런데 아래 처럼 if 문을 사용하면 에러가 난다.

declare @cursor cursor

set @cursor = cursor for

if (@test <> '')
begin
      select * from table1
      where test = @test
end
else
begin
      select * from table1
end

open @cursor

...

 

꼭 if 문을 쓰고 싶다면 if 문 안으로 @cursor 정의를 넣어야 한다.

declare @cursor cursor

if (@test <> '')
begin

	set @cursor = cursor for
    
	select * from table1
	where test = @test
end
else
begin

	set @cursor = cursor for

	select * from table1
end

open @cursor

...

그런데 이렇게 하면 조건이 많아질 수록 비슷한 쿼리를 계속 반복해야 한다.

 

 

이런 경우 아래와 같이 처리하면 간단해진다.

declare @cursor cursor for

select * from table1
where (isnull(@test, '') = '' or test = @test)

open @cursor

...

이렇게 하면 된다.

 

 

반응형
반응형
RESTORE DATABASE DB명 WITH RECOVERY

-------------------------------

DB명만 실제 사용하는 DB 이름으로 바꾸고 실행하면 됩니다.

반응형
반응형
ALTER DATABASE DB명 SET EMERGENCY;

GO

​

ALTER DATABASE DB명 SET SINGLE_USER;

GO

​

DBCC CHECKDB (DB명, REPAIR_ALLOW_DATA_LOSS) WITH ALL_ERRORMSGS;

GO

​

ALTER DATABASE DB명 SET MULTI_USER;

GO

-------------------------------

DB명만 실제 사용하는 DB 이름으로 바꾸고 실행하면 됩니다.

반응형
반응형
EXEC sp_resetstatus 'DB명';

ALTER DATABASE ReportServer SET EMERGENCY

DBCC checkdb('ReportServer')

ALTER DATABASE ReportServer SET SINGLE_USER WITH ROLLBACK IMMEDIATE

DBCC CheckDB ('ReportServer', REPAIR_ALLOW_DATA_LOSS)

ALTER DATABASE ReportServer SET MULTI_USER

-----------------------------------

------ DB명 을 실제 사용하는 DB 이름으로 넣어주면 됩니다.

반응형
반응형
USE DB명

------------------------------------------------------------------------------

-- Don't change anything below this line.

------------------------------------------------------------------------------

GO

​

-- Declare variables

DECLARE @SqlStatement as nvarchar(max)

DECLARE @LogFileLogicalName as sysname

​

-- Alter the database to simple recovery

SET @SqlStatement = 'ALTER DATABASE ' + DB_NAME() + ' SET RECOVERY SIMPLE'

EXEC ( @SqlStatement )

​

-- Make sure it has been altered

SELECT [name], [recovery_model_desc] FROM sys.databases WHERE [name] = DB_NAME()

​

-- Set the log file name variable

SELECT @LogFileLogicalName = [Name] FROM sys.database_files WHERE type = 1

​

-- Shrink the logfile

DBCC Shrinkfile(@LogFileLogicalName, 1)

​

-- Alter the database back to FULL

SET @SqlStatement = 'ALTER DATABASE ' + DB_NAME() + ' SET RECOVERY FULL'

EXEC ( @SqlStatement )

​

-- Make sure it has been changed back to full

SET @SqlStatement = 'SELECT [name], [recovery_model_desc] FROM ' + DB_NAME() + '.sys.databases WHERE [name] = ''' + DB_NAME() + ''''

EXEC ( @SqlStatement )

​

​

SET @SqlStatement = 'ALTER DATABASE ' + DB_NAME() + ' MODIFY file ( name = ' + @LogFileLogicalName + ', maxsize = 2000mb ) '

EXEC ( @SqlStatement )

​

​

SET @SqlStatement = 'dbcc shrinkdatabase(' + DB_NAME() + ',2,truncateonly)'

EXEC ( @SqlStatement )

​

------------------------------------------------------------------------------

맨 첫줄의 DB명에 실제 적용할 DB의 이름을 넣으면 됩니다.

그리고 ldf 의 용량을 수정하려면 maxsize 를 수정하시면 됩니다. 위 예제에서는 2000mb 로 되어 있습니다.

실제 현업에서는 10000mb 이상으로 하셔야 될 겁니다.

그리고 에이전트에 등록해서 정기적으로 정리를 하시지 않으면 금방 꽉차버려서 에러가 날 겁니다.

반응형
반응형

데이터베이스 내 모든 테이블에서 특정 이름의 컬럼을 찾는 쿼리

예) 컬럼명이 name, 이름, 성명인 모든 테이블 찾기

DECLARE @T varchar(255), @C varchar(255);

DECLARE Table_Cursor CURSOR FOR

SELECT a.name, b.name
FROM sysobjects a, syscolumns b
WHERE a.id = b.id AND a.xtype = 'u'
AND (b.xtype = 99 OR b.xtype = 35 OR b.xtype = 231 OR b.xtype = 167);

OPEN Table_Cursor;
FETCH NEXT FROM Table_Cursor INTO @T, @C;

WHILE (@@FETCH_STATUS = 0) BEGIN

	if (@C = 'name' or @C = '이름' or @C = '성명')	---- 이 부분에 컬럼명을 나열하면 됨
	select @T, @C

FETCH NEXT FROM Table_Cursor INTO @T, @C;

END;

CLOSE Table_Cursor;

DEALLOCATE Table_Cursor;
반응형

+ Recent posts