레이블이 mssql인 게시물을 표시합니다. 모든 게시물 표시
레이블이 mssql인 게시물을 표시합니다. 모든 게시물 표시

2015년 9월 23일 수요일

SELECT * INTO & INSERT INTO SELECT 차이점








1.SELECT * INTO사용법
   SELECT  INTO 구문은 원본은 있고 대상 테이블은 새롭게 생성하려 할 경우 사용합니다.
   TABLE A에서 모든 데이터를 가져와 A_COPY라는 테이블을 생성하여 데이터를 INSERT하고 싶습니다.
   물론 A_COPY라는 테이블은 현재 만들어져있지 않습니다.
 
   SELECT * INTO A_COPY FROM A
 
   위와 같이 하면 A테이블과 같은 컬럼과 데이터를 가지는 A_COPY라는 테이블이 생성됩니다.
   그럼 A테이블의 특정 컬럼만 가져오려면?
 
   SELECT * INTO A_COPY
   FROM (
              SELECT COL1,COL2,COL3.... FROM A 
             ) AS TEMP_TABLE
   위와 같이 하면 A테이블의 특정 컬럼만 가져와서 A_COPY라는 테이블을 생성하여 데이터를 INSERT합니다.
 
2.INSERT INTO SELECT 사용법
   INSERT INTO 구문은 원본과 대상테이블이 모두 있을 경우 사용합니다.
   TABLE A에서 모든 데이터를 가져와 B라는 테이블에 INSERT 하고 싶습니다.
  
   INSERT INTO B SELECT * FROM A
   위에서 TABLE A와 TABLE B는 스키마가 동일해야 합니다.
 
   만일 A보다 컬럼수가 적을 경우에는
   INSERT INTO B SELECT COL1,COL2,COL3 FROM A
   와 같이 사용할 수 있습니다.

2015년 8월 26일 수요일

MSSQL Convert , Cast 날짜 변환 함수








MSSQL Convert , Cast 날짜 변환 함수




msdn 참조




Syntax for CAST:
CAST ( expression AS data_type [ ( length ) ] )



Syntax for CONVERT:
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )



SELECT  convert(char(10),convert(datetime, convert(char(8),cast('20060602' as decimal  (10))) ,120),102)









세기 포함 안함(yy)
세기 포함(yyyy)
표준
입력/출력
-0 또는 100 (*) 기본값mon dd yyyy hh:miAM(또는 PM)
1101USAmm/dd/yy
2102ANSIyy.mm.dd
3103영국/프랑스dd/mm/yy
4104독일dd.mm.yy
5105이탈리아dd-mm-yy
6106-dd mon yy
7107-Mon dd, yy
8108-hh:mm:ss
-9 또는 109 (*) 기본값 + 밀리초mon dd yyyy hh:mi:ss:mmmAM(또는 PM)
10110USAmm-dd-yy
11111일본yy/mm/dd
12112ISOyymmdd
-13 또는 113 (*) 유럽 기본값 + 밀리초dd mon yyyy hh:mm:ss:mmm(24h)
14114-hh:mi:ss:mmm(24h)
-20 또는 120 (*) ODBC 표준yyyy-mm-dd hh:mi:ss(24h)
-21 또는 121 (*) ODBC 표준(밀리초)yyyy-mm-dd hh:mi:ss.mmm(24h)
-126(***)ISO8601yyyy-mm-dd Thh:mm:ss.mmm(스페이스 없음)
-130*회교식****dd mon yyyy hh:mi:ss:mmmAM
-131*회교식****dd/mm/yy hh:mi:ss:mmmAM


2015년 8월 6일 목요일

MSSQL CONCAT 둘 이상의 문자열 값을 연결



CONCAT(Transact-SQL)


CONCAT ( string_value1, string_value2 [, string_valueN ] )
-

1.CONCAT 사용


SELECT CONCAT ( 'Happy ', 'Birthday ', 11, '/', '25' ) AS Result;

결과 집합은 다음과 같습니다.
Result
-------------------------
Happy Birthday 11/25

(1 row(s) affected)

2.NULL 값이 있는 CONCAT 사용


CREATE TABLE #temp (
    emp_name nvarchar(200) NOT NULL,
    emp_middlename nvarchar(200) NULL,
    emp_lastname nvarchar(200) NOT NULL
);
INSERT INTO #temp VALUES( 'Name', NULL, 'Lastname' );
SELECT CONCAT( emp_name, emp_middlename, emp_lastname ) AS Result
FROM #temp;
결과 집합은 다음과 같습니다.
Result
------------------
NameLastname

(1 row(s) affected)


2015년 8월 3일 월요일

MSSQL TRIGGER 트리거 예제






MSSQL TRIGGER 트리거 예제


CREATE TRIGGER [dbo].[트리거 이름]
ON 테이블 -- 테이블 이름
FOR DELETE -- 또는 INSERT
AS
DECLARE @field INT = ( SELECT 필드명 FROM deleted )


-- do something ~

2015년 3월 30일 월요일

MSSQL 위도 경도를 이용한 두 위치 사이의 거리 구하기



위도 경도를 이용한 두 위치 사이의 거리 구하기









ALTER FUNCTION [dbo].[FN_TO_DISTANCE](
    @lat1 AS FLOAT,
    @long1 AS FLOAT,
    @lat2 AS FLOAT,
    @long2 AS FLOAT
)
/*
 위도,경도를 이용한 두 위치사이의 거리 구하기
*/
RETURNS FLOAT AS

BEGIN
    DECLARE @V_RETURN FLOAT;

    SELECT @V_RETURN = distance
      FROM
           (SELECT 2 * atn2(sqrt(p.a), sqrt(1-p.a)) * 6387700 as distance
             FROM
                  (SELECT sin(l.dLat/2) * sin(l.dLat/2) + sin(l.dLon/2) * sin(l.dLon/2) * cos(l.lat1) * cos(l.lat2) as a
                    FROM
                         (SELECT radians(k.lat2 - k.lat1) as dLat,
                                radians(k.long2 - k.long1) as dLon,
                                radians(k.lat1) as lat1,
                                radians(k.lat2) as lat2
                           FROM
                                (SELECT @lat1 as lat1,
                                       @long1 as long1,
                                       @lat2 as lat2,
                                       @long2 as long2
                                ) k
                         ) l
                  ) p
           ) o;
    RETURN @V_RETURN;
END;-

2014년 11월 20일 목요일

[SQL2012] 결과집합의 첫 번째 값과 마지막 값을 가져오는 FIRST_VALUE, LAST_VALUE


출처 http://www.sqler.com/537316

안녕하세요? 쓸만한게없네 윤선식입니다.  
SQL Server 2012의 신규 분석 함수로 FIRST_VALUE와 LAST_VALUE 가 있습니다.  

만약 Oracle 11G의 Window Funcion을 사용하신 분이면 금방 이해가 가실 것입니다.. 이와 동일하기 때문이죠

다음 예제 데이터를 통해 기능을 살펴보겠습니다.    

CREATE TABLE dbo.T_FIRST_LAST
(
        SEQ INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
        PRICE INT NOT NULL,
        PROD_NAME VARCHAR(100) NOT NULL
)
;

INSERT INTO dbo.T_FIRST_LAST (PRICE, PROD_NAME) VALUES
(600, '상품1'), (400, '상품6'), (100, '상품3'), (300, '상품2'),
(300, '상품4'), (200, '상품8'), (500, '상품10'), (700, '상품9');

SELECT  SEQ, PRICE, PROD_NAME
FROM    dbo.T_FIRST_LAST
ORDER BY       SEQ
;
1.png


1. FIRST_VALUE
SELECT  SEQ, PRICE, PROD_NAME,
        FIRST_VALUE(PROD_NAME) OVER (ORDER BY PRICE ASC) AS MIN_PRICE_PROD_NAME
FROM    dbo.T_FIRST_LAST
ORDER BY       SEQ
;
2.png

가장 낮은 값인 100에 대한 상품3에 대한 값이 표시됩니다.

2. LAST_VALUE
SELECT  SEQ, PRICE, PROD_NAME,
        LAST_VALUE(PROD_NAME) OVER (ORDER BY PRICE ASC) AS MAX_PRICE_PROD_NAME
FROM    dbo.T_FIRST_LAST
ORDER BY       SEQ
;
3.png

결과가 나오긴 하는데, FIRST_VALUE처럼 가장 낮은 값만 나오는 것이 아니라 데이터가 다른 형태로 나옵니다.
이는 Windows Function OVER 절의 기본 영역이 "RANGE UNBOUNDED PRECEDING AND CURRENT ROW" 이기 때문입니다.

FIRST_VALUE 와 같이 모든 데이터를 지정하려면 다음과 같이 명령어를 기재하시면 됩니다.
SELECT
        SEQ, PRICE, PROD_NAME,
        FIRST_VALUE(PROD_NAME) OVER (ORDER BY PRICE ASC) AS MIN_PRICE_PROD_NAME,
        LAST_VALUE(PROD_NAME) OVER (ORDER BY PRICE ASC
        ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS MAX_PRICE_PROD_NAME
FROM
        dbo.T_FIRST_LAST
ORDER BY
        SEQ
;
4.png

OVER 절에서 영역을 지정하는 주요 단위는 다음과 같습니다.
1) BETWEEN <window frame bound > AND <window frame bound > : ROWS 또는 RANGE와 함께 사용되어 창의 하한(시작) 및 상한(끝) 지점을 지정합니다.<window frame bound>는 경계 시작 지점을 정의하고 <window frame bound>는 경계 끝 지점을 정의합니다.상한은 하한보다 작을 수 없습니다.
2) UNBOUNDED PRECEDING : 창이 파티션의 첫 번째 행에서 시작되도록 지정합니다.UNBOUNDED PRECEDING은 창 시작 지점으로만 지정할 수 있습니다.
3) CURRENT ROW : 창이 현재 행(ROWS와 함께 사용될 경우) 또는 현재 값(RANGE와 함께 사용될 경우)에서 시작되거나 끝나도록 지정합니다.CURRENT ROW는 시작 지점 및 끝 지점 모두로 지정할 수 있습니다.
4) UNBOUNDED FOLLOWING : 창이 파티션의 마지막 행에서 끝나도록 지정합니다.UNBOUNDED FOLLOWING은 창 끝 지점으로만 지정할 수 있습니다.예를 들어 RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING은 현재 행에서 시작하고 파티션의 마지막 행에서 끝나는 창을 정의합니다.
이 외에도 PARTITION BY 구문을 이용해서 더 많은 응용이 가능합니다.

더 자세한 OVER 부분은 아래 URL을 참고해 주세요.

FIRST_VALUE, LAST_VALUE MSDN

또한 FIRST_VALUE, LAST_VALUE OVER 절과 PARTITON BY 에 대한 글은 아래 참조.

SSMS(SQL Server Management Studio) Tip #1 - 사용자 지정 연결 색 설정



출처 http://www.sqler.com/index.php?mid=bSQL2011&document_srl=556674

짧은 강좌 형식으로 SQL Server 2012 SSMS(SQL Server Management Studio) Tip을 알려 드립니다.
이 팁들은 일부 SQL Server 2008 (2008 R2) 에도 해당됩니다.

오늘은 그 첫번째 시간으로, 연결 시 사용자 지정 색 변경에 대한 설명입니다.
이 기능은 관리하는 서버가 여러 대일 경우 현재 연결한 서버가 어떤 것인지 알려줍니다.

Tip #1. 사용자 지정 연결 색 설정
SQL Server를 여러 대 관리하다 보면, 현재 쿼리 창이 어느 서버에 접속했는지 헷갈릴 수 있습니다.
하지만, 사용자 지정 연결 색 설정을 해 두면, 식별하기가 조금은 더 편리해 집니다.

* 이 설정은 SQL Server 2008 및 SQL Server 2008 R2 SSMS에서도 동일하게 동작합니다.

1. 특별한 설정 없이 접속 후 새로운 쿼리창을 실행하면 다음과 같이 기본 색상으로 표시됩니다.
1.png


2. 새로운 서버에 연결합니다. 이 때 "옵션" 버튼을 클릭합니다.
2.png

3. "연결 속성" 탭에서 "사용자 지정 색 사용"을 체크하고, 우측의 "선택" 버튼을 클릭합니다.
3.png

4. 색상을 선택하고 "확인"을 클릭합니다.
4.png

5. 색상 선택이 완료되면, 다음과 같이 사용자 지정 색이 변경된 것을 확인할 수 있습니다. "연결"버튼을 클릭해서 연결합니다.
5.png

6. "새 쿼리" 명령을 통해 쿼리창을 새로 열 경우 다음과 같이 색상이 적용된 것을 확인할 수 있습니다.
6.png

7. 이번엔 다른 서버에 연결해 보겠습니다. 서버 연결 정보를 기재하고, "옵션" 버튼을 클릭합니다.
7.png

8. 위에서 지정한 방식과 같이 사용자 지정 색을 선택하고, "연결" 버튼을 클릭합니다.
8.png

9. 다시 "새 쿼리"를 실행하면 다음과 같이 색상이 적용된 것을 확인할 수 있습니다.
9.png

10. 먼저 연결했던 서버의 쿼리 창에 색상이 적용된 모습입니다.
10.png

11. 뒤에 연결했던 서버의 쿼리 창에 색상이 적용된 모습입니다.
11.png

참고로 SSMS Tools Pack을 설치해서 다른 기능을 구현할 수도 있습니다.
 12.png
-

SSMS(SQL Server Management Studio) Tip #2 - 화면 편의기능 네 가지



출처 http://www.sqler.com/index.php?mid=bSQL2011&document_srl=556724

오늘은 두번째 시간으로, SSMS 사용 시 편리하게 사용할 수 있는 네 가지를 알려 드립니다.
Tip #2. 화면 편의기능 네 가지.

1. 쿼리창 분리
   SSMS 실행 이후 여러 쿼리를 보고 싶은데, SSMS 를 하나 더 실행시키자니 귀찮고, 배열을 하자니 눈에 안 들어오고...
  이럴 때 사용 가능한 기능이 쿼리창 분리입니다.
  1-1. 쿼리창의 제목줄을 클릭합니다.
  1_1.png  

  1-2. 그대로 드래그해서 이동하면, 그 창만 빠져나옵니다.
  1_2.png

  1-3. 이제 저 멀리 두고 따로 편집 가능합니다.
  1_3.png

2. Split Window(분리된 화면 만들기)
   긴 쿼리를 봐야 할 때, 아래 위로 스크롤하면서 확인하는 것은 참 어려운 일입니다.
  이럴 때 사용 가능한 기능이 Split Window 입니다.
  Visual Studio에는 벌써부터 적용된 기능이죠.
  2-1. 우측에 표시된 버튼을 클릭합니다.
  2_1.png

  2-2. 그대로 드래그해서 아래로 내립니다. 그러면, 분리해서 작업이 가능합니다.
  2_2.png

3. 줄번호 표시하기.
   SSMS 초기 설정에는 줄번호가 없습니다. 작업을 편리하게 하기 위해 줄번호가 나오도록 설정해 보겠습니다.
   3-1. 메뉴에서 [도구] > [옵션] 을 선택합니다.
   3_1.png

   3-2. [텍스트 편집기] > [모든 언어] > [표시] 에서 "줄 번호"를 클릭하고, "확인" 버튼을 클릭합니다.
   3_2.png

  3-3. 이제 좌측에 줄 번호가 표시됩니다.
  3_3.png

4. 쿼리창 확대/축소 기능 사용
    PT 진행 시 등 쿼리를 여러 사람에게 보여줘야 할 때, 예전엔 ZoomIt과 같은 툴을 이용하여 화면을 확대했지만,
  이젠 그럴 필요가 없습니다.
  4-1. 쿼리창 좌측 하단에 % 부분을 클릭하여 배율을 조정합니다.
  4_1.png

  4-2. 200% 로 적용했을 때의 화면입니다.
  4_2.png

  * 참고로 축소도 가능하고, 직접 숫자를 기재하는 것도 가능합니다.
-

SSMS(SQL Server Management Studio) Tip #3 - 정규식 사용해서 텍스트 바꾸기



출처 http://www.sqler.com/index.php?mid=bSQL2011&document_srl=558228

오늘은 SSMS 팁 세번째 시간으로 정규식을 사용해서 텍스트를 찾거나 바꾸는 방법에 대해 알아보겠습니다.
이 팁들은 일부 SQL Server 2008 (2008 R2) 에도 해당됩니다.

TIP #3. 정규식을 사용하여 텍스트를 검색하거나 바꾸기 - 와일드 카드 예제 포함

SSMS에서 찾기 및 바꾸기 기능을 잘 활용하면,  별도의 에디터를 열지 않고서도 문자열을 처리할 수 있습니다.

다음 예제 세 가지를 통해 알아보겠습니다.

1. 줄바꿈을 없애고  ,로 바꾸기
  이 기능은 칼럼명을 가져다가 쿼리를 만들 때 유용하게 사용할 수 있습니다.
  (물론 SSMS의 다른 기능을 사용해서 만들 수도 있습니다.)

  1-1. sp_help 또는 ALT+F1을 통해 테이블 정보를 보면 다음과 같이 표시됩니다.
  1-1.png

  1-2. 칼럼리스트만 따로 뽑아와 봤습니다.
  1-2.png

  1-3. 메뉴에서 [편집] > [찾기 및 바꾸기] > [빠른 바꾸기]를 선택하거나 CTRL+H 를 누릅니다.
       찾을 내용엔 "\n"을, 바꿀 내용엔 ","를 넣습니다.
       이 때 "찾기 옵션"을 확장하고 "정규식"을 "사용"합니다.
  1-3.png

  1-4. "모두 바꾸기"를 실행하면 다음과 같이 줄바꿈 문제가 ,로 변경된 것을 확인할 수 있습니다.
  1-4.png

   # \n :  줄바꿈, \t : 탭 입니다.

2. 여러 개의 문자열을 하나의 문자열로 변경하기
 이 기능은 여러 문자열을 하나의 문자열로 바꿀 때 사용합니다.

  2-1. 다음과 같은 텍스트가 있습니다. location 과 address라는 두 단어를 addr로 일괄변경한다면.
  2-1.png

 2-2. 바꾸기를 통해 다음과 같이 지정합니다.
     찾을 내용에 "location|address" 와 같이 | 로 묶습니다.
     바꿀 내용에 "addr"을 넣습니다.
     정규식을 사용하도록 지정합니다.
  2-2.png

 2-3. "모두 바꾸기"를 실행하면 다음과 같이 "location"과 "address" 모두 "addr"로 변경됩니다.
  2-3.png


3. 와일드 카드를 이용해 변경하기
 이 기능은 와일드 카드 기능을 이용해서 패턴 내 단어를 변경할 때 사용합니다.

  3-1. 다음과 같은 텍스트가 있습니다. 숫자가 불필요하다고 판단되어 숫자를 모두 없애보겠습니다.
  3-1.png

 3-2. 바꾸기를 통해 다음과 같이 지정합니다.
     찾을 내용 에 "[0-9]"로 넣고.
     바꿀 내용엔 아무것도 넣지 않습니다.
     정규식을 사용하도록 지정합니다.
  3-2.png

  3-3. "모두 바꾸기"를 실행하면 다음과 같이 숫자 부분이 모두 변경됩니다.
  3-3.png


관련 MSDN
-