반응형

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

...

이렇게 하면 된다.

 

 

반응형
반응형

 

mdb 파일을 열어서 에러가 난 테이블에서 디자인 보기로 들어가 해당 컬럼을 클릭하고

하단 필드 속성에서 유니코드 압축이 '아니오' 로 되어 있으면 '예' 로 바꾸고 저장 후 다시 가져오기를 하면 에러가 나지 않음

반응형
반응형

 

현업에서 작업을 하다보면, 특히 이벤트가 있어서 접속자수가 급격히 증가하면 서버 과부하가 생겨 곤란한 경우를 겪을 수 있다.

 

이런 경우, 어떤 쿼리가 서버에 무리를 주고 있는지 빨리 찾아내야 한다.

 

아래 쿼리를 돌려보면 최근 실행된 쿼리 중 실행속도가 느린 쿼리를 확인할 수 있다.

 

 

SELECT TOP 100

[Object_Name] = object_name(st.objectid),

creation_time,

last_execution_time, 

total_cpu_time = total_worker_time / 1000, 

avg_cpu_time = (total_worker_time / execution_count) / 1000,

min_cpu_time = min_worker_time / 1000,

max_cpu_time = max_worker_time / 1000,

last_cpu_time = last_worker_time / 1000,

total_time_elapsed = total_elapsed_time / 1000 , 

avg_time_elapsed = (total_elapsed_time / execution_count) / 1000, 

min_time_elapsed = min_elapsed_time / 1000, 

max_time_elapsed = max_elapsed_time / 1000, 

avg_physical_reads = total_physical_reads / execution_count,

avg_logical_reads = total_logical_reads / execution_count,

execution_count, 

SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,

(

    (

        CASE statement_end_offset

        WHEN -1 THEN DATALENGTH(st.text)

        ELSE qs.statement_end_offset

        END 

        - qs.statement_start_offset

    ) /2

) + 1

) as statement_text

FROM sys.dm_exec_query_stats qs

CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st

​

----WHERE Object_Name(st.objectid) IS NOT NULL

----AND st.dbid = DB_ID()ORDER BY total_worker_time / execution_count DESC 
반응형
반응형
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