SELECT DISTINCT a.name
    FROM sysobjects AS a
                   LEFT JOIN syscomments AS ON a.id = b.id
 WHERE a.xtype = 'P'
       AND b.text LIKE '%찾은문자열%'


dateadd, datediff DATABASE/MS SQL 2016. 1. 12. 16:47

dateadd

-- 월의 마지막 날
select dateadd(month,1,getdate())-day(getdate())
-- 월의 첫째날
select dateadd(day,-(day(getdate()-1)), getdate())
-- 월의 13개월전 첫째날
select dateadd(month,-12,getdate())-(day(getdate())-1)

-- 1일 더하기
select dateadd(day,1,getdate())
-- 1월 더하기
select dateadd(month,1,getdate())
-- 1년 더하기
select dateadd(year,1,getdate())



datediff

datediff( 시간단위구분자, 시작시간, 종료시간 )


 

getdate()+1 은 현재시간에서 1일을 더하는 함수이다.

현재 시간이 2012-12-20 11:50:11 이면, getdate()+1 은 2012-12-21 11:50:11 이 된다

 

 

각각 분단위, 초단위, 시간단위, 일단위, 월단위, 년단위로 구한다.

select DATEDIFF ( mi , getdate() , getdate()+1 ) ==> 1440 분 (1일)

select DATEDIFF ( s , getdate() , getdate()+1 ) ==> 86400 초 (1일)

select DATEDIFF ( hour , getdate() , getdate()+1 ) ==> 24 시간 (1일)

select DATEDIFF ( day , getdate() , getdate()+1 ) ==> 1 일 (1일)

select DATEDIFF ( month , getdate() , getdate()+31 ) ==> 1 개월 (31일)

select DATEDIFF ( year , getdate() , getdate()+730 ) ==> 2 년 (730일)

 

출처: http://lefigaro.tistory.com/14 


f--Getdate()
Select Getdate()

--YYYY/MM/DD
Select Convert(varchar(10),Getdate(),111)

--YYYYMMDD
Select Convert(varchar(10),Getdate(),112)

--HH:MM:SS
Select Convert(varchar(8),Getdate(),108)

--HH:MM:SS:mmm
Select Convert(varchar(12),Getdate(),114)

--HHMMSS
Select Replace(Convert(varchar(8),Getdate(),108),':','')

--HHMMSSmmm
Select Replace(Convert(varchar(12),Getdate(),114),':','')

--YYYY/MM/DD HH:MM:SS
Select Replace(Convert(varchar(30),Getdate(),120),'-','/')

--YYYY/MM/DD HH:MM:SS
Select Replace(Convert(varchar(30),Getdate(),121),'-','/')

--YYYY/MM/DD HH:MM:SS
Select Convert(varchar(10),Getdate(),111) + Space(1) + Convert(varchar(8),Getdate(),108)

--YYYYMMDDHHMMSS
Select Convert(varchar(10),Getdate(),112) + Replace(Convert(varchar(8),Getdate(),108),':','')

출처 - http://blog.danggun.net/1036


이전 글에서 테이블변수에 대해서 이야기를 했었습니다.
임시테이블과 테이블변수는 사용하는 방법면에서는 별차이가 없으나 성능상 차이가 있다고 합니다.
테이블 변수가 성능면에서 더 유리하다고 하는데....직접 비교는 해보지 않아서 잘 모르겠습니다 ㅎㅎㅎ
(참고 : [MSSQL] 저장프로시저에서 테이블(Table) 변수 사용하기)

그런이유로 테이블 변수를 더 권장하고 있으나....임시 테이블을 사용하는 방법도 알려드리겠습니다 ㅎㅎ


1.선언

선언 임시테이블이므로 크래딧테이블(Create Table)로 생성하면 됩니다.


1
2
3
4
5
--리턴값을 받기위한 임시 테이블
--Create Table [생성할 테이블 이름] ( [컬럼명] [데이터형], ... , [컬럼명] [데이터형] )
Create Table #Result ( nIndex int
        , sName varchar(16)
        , sID varchar(16))


2.입력
입력은 테이블변수와 마찬가지로 인서트(Insert)를 이용하면 됩니다.

1
2
3
4
--Insert [임시테이블] Exec [sql문]
Insert #Result Exec ProcTest @nIndox
            , @sName
            , @sID


3.사용
임시테이블도 일반적인 테이블 처럼 사용할 수 있습니다.

1
Set @nTemp = (Select * From #Result)


으앙 정신없다. 오랜만에 MSSQL , 아 진짜 DTG때문에 죽겠다. 꿈에서도 작업함ㅋㅋ


하루의 데이터를 정리해서 요약하는 프로시저가 도는데


문자열 이나 이진 데이터 는 잘립니다.


라는 문구와 함께 매번 프로시저가 종료되었다. 


원인은 입력 테이블의 크기보다 큰 값을 넣으려고 해서.


차량번호를 입력하는 VARCHAR(12) 짜리 열에 

경기32바1111 과 같은 제대로 된 차량번호가 아닌 테스트용 임시 차량번호 테스트경기32바1111 을 넣으려고 하니 

사이즈가 너무 커서 에러발생..


그래서 테이블을 지워버리고 해당 열을 VARCHAR(20)으로 사이즈를 바꿔서 새로 만들었다. 

해결끝.

truncate ->this resets the entire table, is there a way via truncate to reset particular records/check conditions.

For ex: i want to reset all the data and keep last 30 days inside the table.

Thanks.

share|improve this question

No, TRUNCATE is all or nothing. You can do a DELETE FROM <table> WHERE <conditions> but this loses the speed advantages of TRUNCATE.

share|improve this answer
Thanks, assuming that condition, how do i keep last 10 days data and delete the rest (for say the table has 10 million records), in an optimized manner. – Sharpeye500 Sep 13 '10 at 22:20
The speed from TRUNCATE is because it doesn't write to the logs – OMG Ponies Sep 13 '10 at 22:21

The short answer is no: MySQL does not allow you to add a WHERE clause to the TRUNCATEstatement. Here's MySQL's documentation about the TRUNCATE statement.

But the good news is that you can (somewhat) work around this limitation.

Simple, safe, clean but slow solution using DELETE

First of all, if the table is small enough, simply use the DELETE statement (it had to be mentioned):

1. LOCK TABLE my_table WRITE;
2. DELETE FROM my_table WHERE my_date<DATE_SUB(NOW(), INTERVAL 1 MONTH);
3. UNLOCK TABLES;

The LOCK and UNLOCK statements are not compulsory, but they will speed things up and avoid potential deadlocks.

Unfortunately, this will be very slow if your table is large... and since you are considering using theTRUNCATE statement, I suppose it's because your table is large.

So here's one way to solve your problem using the TRUNCATE statement:

Simple, fast, but unsafe solution using TRUNCATE

1. CREATE TABLE my_table_backup AS
      SELECT * FROM my_table WHERE my_date>=DATE_SUB(NOW(), INTERVAL 1 MONTH);
2. TRUNCATE my_table;
3. LOCK TABLE my_table WRITE, my_table_backup WRITE;
4. INSERT INTO my_table SELECT * FROM my_table_backup;
5. UNLOCK TABLES;
6. DROP TABLE my_table_backup;

Unfortunately, this solution is a bit unsafe if other processes are inserting records in the table at the same time:

  • any record inserted between steps 1 and 2 will be lost
  • the TRUNCATE statement resets the AUTO-INCREMENT counter to zero. So any record inserted between steps 2 and 3 will have an ID that will be lower than older IDs and that might even conflict with IDs inserted at step 4 (note that the AUTO-INCREMENT counter will be back to it's proper value after step 4).

Unfortunately, it is not possible to lock the table and truncate it. But we can (somehow) work around thatlimitation using RENAME.

Half-simple, fast, safe but noisy solution using TRUNCATE

1. RENAME TABLE my_table TO my_table_work;
2. CREATE TABLE my_table_backup AS
     SELECT * FROM my_table_work WHERE my_date>DATE_SUB(NOW(), INTERVAL 1 MONTH);
3. TRUNCATE my_table_work;
4. LOCK TABLE my_table_work WRITE, my_table_backup WRITE;
5. INSERT INTO my_table_work SELECT * FROM my_table_backup;
6. UNLOCK TABLES;
7. RENAME TABLE my_table_work TO my_table;
8. DROP TABLE my_table_backup;

This should be completely safe and quite fast. The only problem is that other processes will see tablemy_table disappear for a few seconds. This might lead to errors being displayed in logs everywhere. So it's a safe solution, but it's "noisy".

Disclaimer: I am not a MySQL expert, so these solutions might actually be crappy. The only guarantee I can offer is that they work fine for me. If some expert can comment on these solutions, I would be grateful.

share|improve this answer


출처 : http://stackoverflow.com/questions/3704834/truncate-with-condition


mssql 테이블 복사 쿼리 입니다.


1. 테이블을 생성하면서 테이블의 데이타 복사


select * into 생성될테이블명 from 원본테이블명


테이블 구조만 복사하겠다면

select * into 생성될테이블명 from 원본테이블명 where 1=2


2. 테이블이 이미 생성되어 있는경우 데이타만 복사


insert into 카피될테이블명 select * from 원본테이블명


특정 데이타만 복사 하겠다면

insert into 카피될테이블명 select * from 원본테이블명 where 검색조건


 입력받은 seq 보다 작은 seq의 데이터들을 999개씩 지우는 프로시저 :)



USE [OKNETV2_WEB]

GO

/****** Object:  StoredProcedure [dbo].[delete_proc]    Script Date: 09/10/2013 14:03:33 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

-- =============================================

-- Author: <Author,,Name>

-- Create date: <Create Date,,>

-- Description: <Description,,>

-- =============================================

ALTER PROCEDURE [dbo].[delete_proc]

 @seq int

AS

while @seq > 0

BEGIN

delete from ODTG_DETAIL 

where SEQ>(@seq -1000) and SEQ < @seq


set @seq = @seq - 1000


END



약 천 육백만개의 데이터를 지워야 하는데..


디비 부하때문에 천개씩 지워야 하는상황 :(


천개씩 몇번 하다보니 이건 아니다 싶어서.... 


그래서 저장 프로시저를 만들었다. 


사실 프로시저 안에서 반복문이 돌아가는건 안좋은 거랜다. 


밖의 실행문에서 반복하여 프로시저를 실행해야 옳다고 하니 참고 할 것.



 



2차출처: http://ash84.tistory.com/335

[펌] MS-SQL : 저장 프로시저 만들기


Post written by AhnSeongHyun
Programming/C/C++/C# 2008/05/22 13:51

출처 : http://cafe.naver.com/hackertime/397

저장 프로시저 만들기


사용법)

CREATE PROC[EDURE] 저장 프로시저 이름
[저장 프로시저의 매개 변수 목록]
AS
 저장 프로시저 내에서 실행될 쿼리들

 

1. 매개변수 없는 프로시져

예)

CREATE PROC up_member

AS

Begin 
 SELECT *
 FROM test_member

End


실행명령 :  EXEC 실행할 저장 프로시저 이름 (EXEC up_member)

 

2. 매개변수 있는 프로시져

예)

CREATE PROC up_member

@id varchar(20)

AS

Begin 
 SELECT *
 FROM test_member

 WHERE member_id=@id

End


실행명령 :  EXEC 실행할 저장 프로시저 이름 변수 (EXEC up_member 'sunmi')

 

3. 리턴값을 갖는 프로시져

예)

CREATE PROC up_member

AS

Begin

 DECLARE @Count int
 SELECT @Count = count(*)
 FROM test_member

 RETRUN @Count

End

 

실행명령 :  

DECLARE @Count int
EXEC @Count = up_member
SELECT @Count

 

4. OUTPUT 매개변수 이용하는 프로시져

예)

CREATE PROC up_member

@Count int OUTPUT
AS

Begin

  SELECT @Count = count(*)
 FROM test_member

End


실행명령 :  

DECLARE @Count int
EXEC  up_member @Count OUTPUT
SELECT @Count

 

5. 프로시져 삭제하기

- drop proc 프로시저명

 

6 프로시져 수정하기

-

ALTER PROC 수정할 SP 이름
[프로시저 매개 변수 목록]
AS
실행할 쿼리 문장들

 

7. 프로시저내에 분기

-

CREATE PROC  sp_UpPrice
    @type    char(12),
    @plus    Float
AS
Begin 
    Declare @Check    int

    Select @Check = Max(price) from titles
    Where type = @type

    if @Check < 50 
        Begin
            Update titles SET price = price + @plus
            Where type = @type

            Select @Check = 1
        End
    Else
        Select @Check = 0

    Return @Check
End