애자일 프랙티스 가이드라인

참고 : http://insightbook.springnote.com/pages/411012


『애자일 프랙티스: 빠르고 유연한, 개발자의 실천 가이드』의 가이드라인을 요약 자료.



비난은 버그를 수정하지 못한다.

손가락질 하는 대신, 가능한 해결책을 제시하라. 중요한 것은 긍정적인 결과다.



땜질식 수정에 빠지지 말라.

깔끔하고 모든 것이 드러나도록 코드에 정력을 쏟아라.



사람이 아니라 아이디어를 비평하라.

누구 아이디어가 더 나은지를 입증하는 것이 아니라 해결책에 도달하는데 자부심을 가져라.



올바른 일을 하라.

정직하라. 그리고 진실을 얘기할 용기를 가져라. 때로 이렇게 한다는 것이 어려울 수도 있지만, 그렇기 때문에 용기가 필요한 것이다.



기술 변화를 따라 가라.

모든 분야에서 전문가가 될 필요는 없지만, 업계가 어디로 가는지 알고 있어야 하고, 그에 맞춰서 경력과 프로젝트 계획을 세워야 한다.



여러분 자신과 팀에 대한 기대치를 높여라.

도시락 회의를 통하여 모든 사람의 지식과 숙련도를 올리고 사람들이 화합하게 하자. 즉, 팀이 흥미를 보이는 기술이나 프로젝트를 이롭게 할 기술을 도입하자.



새로운 기술을 배우고 예전 기술은 버려라.

새 기술을 배울 때, 여러분을 방해할 낡은 습관을 버려라. 결국 구형 차보다는 새 차가 훨씬 낫다.



계속 왜냐고 물어보라.

여러분이 들은 얘기들을 액면 그대로 받아들이지 마라. 쟁점이 되는 내용의 핵심을 이해할 때까지 계속 질문하라.



일이 쌓이기 전에 부딪쳐라.

사건들 사이에 꾸준하고 반복적인 간격을 유지해야 일상적으로 되풀이되는 일을 해결하기 쉽다.



고객이 결정하도록 하라.

개발자, 관리자, 비즈니스 애널리스트가 비즈니스에 치명적인 결정을 내려서는 안 된다. 사업주가 이해할 수 있는 언어로 세부 내용을 설명하고 사업주가 결정하도록 하라.



좋은 설계는 지도다. 스스로 진화하게 하자.

설계는 바른 방향으로 인도한다. 그것은 허물 수 없는 경계가 아니다. 특정한 방식을 강요해서는 안 된다. 여러분이 설계(혹은 설계자)에게 인질로 잡혀서는 안 된다.



필요에 따라 기술을 택하라.

먼저 무엇이 필요한지 정하라. 그러고 나서 그 특정한 문제에 기술 사용 여부를 판단하라. 어떤 기술의 사용에 결정적인 질문을 하고 진실하게 답해 보라.



프로젝트를 항상 릴리스 가능하게 하라.

프로젝트를 항상 컴파일할 수 있고, 실행할 수 있으며, 테스트하고 당장에 배치할 수 있게 하자.



일찍, 자주 통합하라.

코드 통합은 주요 위험 요인이다. 이 위험을 완화시키려면, 일찍 통합하고 규칙적으로 계속 통합해야 한다.



시작부터 애플리케이션을 자동 배치하라.

의존성 테스트를 위해 다양한 구성의 머신에 애플리케이션을 설치할 때, 이 자동 배치를 사용하라. 품질보증은 애플리케이션 뿐 아니라 배치를 테스트해야 한다.



분명히 보이게 개발하라.

애플리케이션이 개발 도중 항상 눈에 띄게 하고 고객의 마음에 들게 하라. 고객과 접촉하고 매 주 또는 2주에 한 번씩 데모를 사용하여 피드백을 미리 구하라.



점진적으로 개발하라.

최소의 유용한 기능 단위로 묶어서 제품을 릴리스하라. 각 추가기능의 개발에 1~4주 정도의 반복 주기를 사용하라.



실제 일을 기초로 해서 견적하라.

실질적인 견적을 내기 위해 팀이 현재 프로젝트를 고객과 함께 수행하도록 하라. 고객이 기능과 예산을 조절하도록 하라.



자동화된 단위테스트를 사용하라.

좋은 단위테스트는 문제를 즉시 경고한다. 견고한 단위테스트가 자리 잡지 않았다면 설계나 코드 변경을 하지 말자.



만들기 전에 사용하라.

테스트 주도 개발을 설계 툴로써 사용하자. 테스트 주도 개발은 여러분을 더 실용적이고 더 간단한 설계로 인도할 것이다.



차이는 다른 결과를 만든다.

지속적 통합 툴을 사용해서, 지원하는 플랫폼과 환경의 조합마다 단위테스트를 실행하자. 문제가 여러분을 부르기 전에 능동적으로 문제를 찾자.



핵심 비즈니스 로직에 해당하는 테스트를 만들자.

고객이 이러한 테스트를 격리해서 검증하게 하고, 일반적인 테스트 수행의 일부로 이러한 테스트를 자동적으로 시험하게 하자.



얼마나 많은 일이 남았는지 측정하라.

현실성이 떨어지는 측정 기준으로 자신이나 팀을 기만하지 말자. 해야 할 작업의 백로그를 측정하자.



모든 불평은 진실을 담고 있다.

진실을 찾아, 진짜 문제를 해결해라.



독창적이지 않고, 명확하게 코드를 작성하자.

코드를 읽는 사람에게 의도를 명확하게 표현하자. 읽기 쉽지 않은 코드는 독창적이지도 않다.



이야기하는 주석.

잘 고르고, 의미 있는 이름을 사용해서 코드를 문서화하라. 메서드의 목적과 제한 조건을 설명하는 주석을 사용하라. 좋은 코드를 대신하려고 주석을 사용하지 말자.



능동적으로 트레이드오프를 평가하자.

성능, 편의성, 생산성, 비용, 적시 릴리스를 고려하자. 성능이 적당하면, 다른 요소를 향상시키는데 집중하자. 하찮거나 미미한 성능이나 우아함을 위해서 디자인을 복잡하게 하지 말자.



짧은 수정/빌드/테스트 주기 안에서 코드를 작성하자.

긴 주기 동안 코딩을 하는 것보다 짧은 주기에서 코딩을 하는 편이 더 낫다. 유지보수하는데 더 명확하고 간단하며 쉬운 코드를 만들 것이다.



동작하는 가장 단순한 해결책을 만들자.

패턴, 원칙, 기술을 사용해야 하는 부득이한 사정이 있을 때만 패턴, 원칙, 기술을 포함하자.



클래스에 집중하고 컴포넌트를 작게 유지해라.

커다란 클래스나 컴포넌트 혹은 다방면에서 잡다한 클래스를 만들고픈 유혹을 피해라.



묻지 말고, 말해라.

다른 객체나, 컴포넌트의 일을 떠맡지 마라. 객체나 컴포넌트에 무엇을 하는지 알리고, 자신의 일에 충실해라.



코드를 교체해서 시스템을 확장하자.

인터페이스 계약을 존중하는 클래스를 교체해서 기능을 추가하거나 강화하자. 위임은 언제나 상속보다 바람직하다.



문제와 해결책의 로그를 보존하자.

문제를 해결하는 일의 일부는 나중에 해결책을 찾고 적용할 수 있도록 해결책의 상세 내용을 보존하는 것이다.



경고를 에러처럼 다루자.

경고가 있는 코드를 체크인 하는 것은 에러가 있는 코드나 테스트에 실패한 코드를 체크인하는 것만큼 나쁘다. 체크인한 코드는 빌드 툴에서 어떤 에러도 만들어서는 안 된다.



문제를 격리해서 공격하라.

문제를 해결할 때 문제를 주위와 분리시켜라. 특히 큰 애플리케이션의 경우에 말이다.



모든 예외를 처리하거나 전달하라.

예외를 덮어 두지 말자. 임시로라도 말이다. 코드가 실패할 수 있다고 생각하며 작성하자.



유용한 에러 메시지를 제공하자.

에러의 상세 내용을 알아내기 쉬운 방법을 제공하자. 문제가 생겼을 때 문제에 대해서 할 수 있는 한 많은 지원과 관련된 상세 정보를 제공하라. 그렇지만 이 정보와 함께 사용자를 파묻지는 말자.



스탠드 업 미팅을 사용하자.

스탠드 업 미팅은 팀을 같은 곳에 둔다. 회의를 열성적이면서 짧고, 집중적으로 유지하자.



좋은 디자인은 활동적인 프로그래머로부터 진화한다.

진짜 통찰력은 활동적인 코딩 작업에서 나온다. 코드를 작성하지 않는 아키텍트를 기용하지 말자. 시스템의 현실을 알지 못하는 아키텍트는 설계를 할 수 없다.



코드 공동 소유를 강조하자.

개발자들을 순환시켜 전체 시스템의 다른 영역에 있는 서로 다른 모듈이나 태스크를 교차해서 개발시키자.



멘토가 되자.

아는 것을 공유하는 데 즐거움이 있다. 얻은 만큼 베풀어라. 더 나은 목표를 달성하기 위해서 다른 사람을 자극하자. 팀의 전체적인 역량을 향상시키자.



다른 사람에게 문제를 해결할 기회를 주자.

다른 사람에게 해결책을 주는 대신에 올바른 방향을 알려주자. 그 과정에서 모두 뭔가를 배울 수 있다.



준비 되었을 때만 코드를 공유하라.

다른 사람이 쓸 수 있도록 준비되지 않은 코드는 절대 체크인하지 마라. 컴파일이 안 되었거나 단위테스트를 통과하지 못한 코드를 고의적으로 체크인


하는 것은 프로젝트의 범죄적인 태만 행위로 간주해야 한다.



모든 코드를 리뷰하자.

코드 리뷰는 코드 품질을 개선하고 에러를 낮추는데 매우 가치 있는 것이다. 코드 리뷰를 올바르게 했다면, 리뷰는 실용적이고 효과적일 수 있다. 다른 개발자로 하여금 작업이 끝날 때마다 코드 리뷰를 하게 하자.



다른 사람에게 계속해서 알리자.

여러분이 조사한 좋은 자료나 자신의 상황, 아이디어를 발표하자. 다른 사람이 일의 상황을 물을 때까지 기다리지 말자.
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기

Posted by 홍반장

2009/01/29 11:52 2009/01/29 11:52
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/3938

[MS-SQL] WHILE(Transact-SQL)

SQL 문 또는 문 블록의 반복 실행을 위한 조건을 설정합니다. 문은 지정된 조건이 true인 한 반복적으로 실행됩니다. WHILE 루프 내의 문 실행은 BREAK와 CONTINUE 키워드를 사용하여 루프 내에서 제어할 수 있습니다.

Transact-SQL 구문 표기 규칙

구문

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

WHILE Boolean_expression
{ sql_statement | statement_block }
[ BREAK ]
{ sql_statement | statement_block }
[ CONTINUE ]
{ sql_statement | statement_block }

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



주의
둘 이상의 WHILE 루프가 중첩된 경우, 내부 루프에 BREAK가 있으면 현재 루프를 종료하고 한 단계 바깥쪽 루프로 이동합니다. 먼저 내부 루프의 끝 이후에 있는 모든 문이 실행된 다음 바깥쪽 루프가 다시 시작됩니다.

인수
Boolean_expression

TRUE 또는 FALSE를 반환하는 식입니다. 부울 식에 SELECT 문이 포함된 경우에는 SELECT 문을 괄호로 묶어야 합니다.

{sql_statement | statement_block}

문 블록에 정의된 Transact-SQL 문이나 문 그룹입니다. 문 블록을 정의하려면 흐름 제어 키워드인 BEGIN 및 END를 사용하십시오.

BREAK

현재 위치에 해당하는 WHILE 루프를 종료합니다. 루프의 끝을 표시하는 END 키워드 다음에 있는 모든 문은 그대로 실행됩니다.

CONTINUE

CONTINUE 키워드 다음의 모든 문을 무시하고 WHILE 루프가 다시 시작되도록 합니다.



1. 중첩된 IF...ELSE 및 WHILE에서 BREAK 및 CONTINUE 사용
다음 예에서는 제품의 평균 정가가 $300 미만인 경우 WHILE 루프가 가격을 두 배로 한 다음 최대 가격을 선택합니다. 최대 가격이 $500 이하인 경우 WHILE 루프가 다시 시작되어 가격을 다시 두 배로 만듭니다. 이 루프는 최대 가격이 $500를 초과할 때까지 가격을 계속 두 배로 만든 다음 WHILE 루프를 종료하고 메시지를 출력합니다.


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

USE AdventureWorks;
GO
WHILE (SELECT AVG(ListPrice) FROM Production.Product) < $300
BEGIN
UPDATE Production.Product
SET ListPrice = ListPrice * 2
SELECT MAX(ListPrice) FROM Production.Product
IF (SELECT MAX(ListPrice) FROM Production.Product) > $500
BREAK
ELSE
CONTINUE
END
PRINT 'Too much for the market to bear';

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

2. 커서가 있는 쿼리 내에서 WHILE 사용
다음 WHILE 구문은 AdventureWorks 데이터베이스에 있는 모든 테이블의 행 개수를 반환합니다. WHILE 구문은 커서와 함께 사용되는 @@FETCH_STATUS 함수의 반환 값을 테스트합니다. @@FETCH_STATUS는 -2, -1 또는 0을 반환할 수 있기 때문에 3가지 경우를 모두 테스트해야 합니다. 쿼리가 실행된 이후에 커서 결과로부터 행을 삭제한 경우에는 해당 행을 건너뜁니다. 성공적으로 인출(0)된 경우 BEGIN...END 루프 내의 SELECT가 실행됩니다.


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

USE AdventureWorks;
GO
DECLARE tnames_cursor CURSOR
FOR
SELECT s.name + '.' + t.name
FROM sys.tables AS t
JOIN sys.schemas AS s ON s.schema_id = t.schema_id;
OPEN tnames_cursor;
DECLARE @tablename sysname;
FETCH NEXT FROM tnames_cursor INTO @tablename;
WHILE (@@FETCH_STATUS <> -1)
BEGIN
IF (@@FETCH_STATUS <> -2)
BEGIN
SELECT @tablename = RTRIM(@tablename);
EXEC ('SELECT ''' + @tablename + ''' = count(*) FROM '
+ @tablename );
PRINT ' ';
END;
FETCH NEXT FROM tnames_cursor INTO @tablename;
END;
CLOSE tnames_cursor;
DEALLOCATE tnames_cursor;

------------------------------------------------------------------------------------------
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기

Posted by 홍반장

2009/01/28 12:03 2009/01/28 12:03
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/3934

[MS-SQL] GOTO(Transact-SQL)

실행 흐름을 지정된 레이블로 변경합니다. GOTO 다음에 이어지는 Transact-SQL 문을 건너뛰고 지정된 레이블에서 처리를 계속 이어갑니다. GOTO 문과 레이블은 프로시저, 일괄 처리, 문 블록 등 어디에서나 사용할 수 있습니다. GOTO 문은 중첩될 수 있습니다.

구문
------------------------------------------------------------------------------------------

Define the label: label : Alter the execution:
GOTO label

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

주의
GOTO는 조건부 흐름 제어 문, 문 블록 또는 프로시저 내에서 사용할 수 있지만 일괄 처리 밖에 있는 레이블로 이동할 수 없습니다. GOTO 분기는 GOTO 전후에 정의된 레이블로 이동할 수 있습니다.

인수
label
GOTO의 대상이 해당 레이블인 경우 처리가 시작되는 지점입니다. 레이블은 식별자 규칙을 따라야 합니다. 레이블은 GOTO 사용 여부에 관계 없이 주석을 기록하는 방법으로 사용될 수 있습니다.

사용 권한
GOTO 권한은 모든 유효한 사용자에게 기본적으로 부여됩니다.


다음 예에서는 WHILE 사용의 대안으로 GOTO 루핑을 보여 줍니다.

참고:
tnames_cursor 커서는 정의되지 않습니다. 이 예는 설명을 위해 작성한 것입니다.

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

USE AdventureWorks;
GO
DECLARE @tablename sysname
SET @tablename = N'Person.AddressType'
table_loop:
IF (@@FETCH_STATUS <> -2)
BEGIN
SELECT @tablename = RTRIM(UPPER(@tablename))
EXEC ('SELECT ''' + @tablename + ''' = COUNT(*) FROM '
+ @tablename )
PRINT ' '
END
FETCH NEXT FROM tnames_cursor INTO @tablename
IF (@@FETCH_STATUS <> -1) GOTO table_loop
GO

------------------------------------------------------------------------------------------
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기

Posted by 홍반장

2009/01/28 12:00 2009/01/28 12:00
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/3933

ISNULL
: 식이 Null인지 여부에 따라 부울 결과를 반환합니다.
Null 값이 포함되어 있을 경우 TRUE를 반환합니다.

-- =================================================
-- Author: 김홍완
-- Create date: 2009-01-22
-- Description: 표준 SELECT
-- EXEC SP_COMMON_SELECT '테이블명','출력개수','필드명','조건절','정렬값','그룹값'
-- =================================================

CREATE PROCEDURE [DBO].[SP_COMMON_SELECT]

@tableName varchar(32) -- 테이블명
, @top varchar(16)=NULL -- 출력개수
, @field varchar(512)='*' -- 필드명
, @strWhere varchar(512)=NULL -- 조건값
, @strOrder varchar(512)=NULL -- 정렬값
, @strGroup varchar(128)=NULL -- 그룹값

AS

BEGIN
SET NOCOUNT ON;

DECLARE @QueryStr varchar(8000) -- 쿼리문
IF @TOP = ''
SET @TOP = NULL
IF @field = ''
SET @field = NULL
IF @strWhere = ''
SET @strWhere = NULL
IF @strOrder = ''
SET @strOrder = NULL
IF @strGroup = ''
SET @strGroup = NULL

SET @QueryStr = 'SELECT '+ ISNULL(' TOP ' + @top,' ') + ISNULL( ' ' + @field, ' * ') +' FROM '+ @tableName
+ ISNULL(' WHERE '+@strWhere,' ')
+ ISNULL(' ORDER BY '+ @strOrder,' ')
+ ISNULL(' GROUP BY '+ @strGroup,' ')


-- PRINT @QueryStr
EXEC(@QueryStr)

END
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기

Posted by 홍반장

2009/01/22 16:08 2009/01/22 16:08
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/3924

[MS-SQL] UPDATE ... CASE ...

UPDATE를 사용하여 테이블에 대해 상당히 복잡한 수정 작업을 해야 할 경우,
CASE 수식을 사용할 수 있다.

즉, 난해한 함수들과 제어문을 사용하여 개별적으로 UPDATE를 실행시켜야 되는 상황에서, 간단히 CASE 를 사용하여 프로그램 로직을 내장시킬 수 있다.

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

SELECT TITLE_ID, TYPE, PRICE, FROM TITLES

UPDATE TITLES SET
PRICE = PRICE * CASE TITLE
   WHEN 'business' THEN 1.5
   WHEN 'mod_cook' THEN .8
   WHEN 'trad_cook' THEN .6
   WHEN 'psychology' THEN .5
   WHEN 'popular_comp' THEN 1.75
   ELSE .75

-------------------------------------------------------
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기

Posted by 홍반장

2009/01/22 14:41 2009/01/22 14:41
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/3923

[MS-SQL] @@SERVERNAME , @@SERVICENAME

@@SERVERNAME(Transact-SQL)

SQL Server 를 실행하는 로컬 서버의 이름을 반환합니다.

구문

@@SERVERNAME


주의
SQL Server 설치 프로그램은 설치 중에 서버 이름을 컴퓨터 이름으로 설정합니다. sp_addserver를 사용하여 @@SERVERNAME을 변경한 다음, SQL Server를 다시 시작하십시오. 그러나 항상 이 방법을 사용해야 하는 것은 아닙니다.

여러 SQL Server 인스턴스가 설치되어 있는 경우 로컬 서버 이름이 설치 후 변경되지 않으면 @@SERVERNAME은 다음 로컬 서버 이름 정보를 반환합니다.

인스턴스 서버 정보
기본 인스턴스 - 'servername'

명명된 인스턴스 - 'servername\instancename'

가상 서버 - 기본 인스턴스 - 'virtualservername'

가상 서버 - 명명된 인스턴스 - 'virtualservername\instancename'


@@SERVERNAME 함수와 SERVERPROPERTY 함수의 SERVERNAME 속성이 비슷한 형식의 문자열을 반환하더라도 정보는 다를 수 있습니다. SERVERNAME 속성은 컴퓨터의 네트워크 이름 변경을 자동으로 보고합니다.

이와 달리 @@SERVERNAME은 이런 변경을 보고하지 않습니다. @@SERVERNAME은 sp_addserver 또는 sp_dropserver 저장 프로시저를 사용하여 로컬 서버 이름 변경을 보고합니다.

반환 유형
nvarchar


다음 예에서는 @@SERVERNAME의 사용법을 보여 줍니다.

------------------------------------------------------------------------------------------
SELECT @@SERVERNAME AS 'Server Name'


결과 집합 예는 다음과 같습니다.

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

Server Name
---------------------------------
ACCTG

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





@@SERVICENAME(Transact-SQL)


SQL Server 가 실행되고 있는 레지스트리 키의 이름을 반환합니다. @@SERVICENAME은 현재 인스턴스가 기본 인스턴스인 경우에는 'MSSQLSERVER'를 반환하고 현재 인스턴스가 명명된 인스턴스인 경우에는 인스턴스 이름을 반환합니다.

구문


//=========================================================================================

@@SERVICENAME


주의
SQL Server 는 Windows NT에서 MSSQLServer라는 서비스로 실행됩니다. Windows 98에서는 서비스를 지원하지 않으므로 서비스로 실행되지 않습니다.

반환 유형
nvarchar


다음 예에서는 @@SERVICENAME의 사용법을 보여 줍니다.


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

SELECT @@SERVICENAME AS 'Service Name'

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


결과 집합은 다음과 같습니다.

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

Service Name
------------------------------
MSSQLSERVER

------------------------------------------------------------------------------------------
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기

Posted by 홍반장

2009/01/22 11:57 2009/01/22 11:57
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/3922

[MS-SQL] @@IDENTITY(Transact-SQL)

@@IDENTITY(Transact-SQL)

마지막으로 삽입된 ID 값을 반환하는 시스템 함수입니다.

Transact-SQL 구문 표기 규칙

구문

@@IDENTITY


주의
INSERT, SELECT INTO 또는 대량 복사 문이 완료된 후 @@IDENTITY에는 문에 의해 생성된 마지막 ID 값이 들어 있습니다. 문이 ID 열이 있는 테이블에 영향을 주지 않은 경우에 @@IDENTITY는 NULL을 반환합니다. 여러 행이 삽입되어 여러 ID 값이 생성되면 @@IDENTITY는 마지막으로 생성된 ID 값을 반환합니다. 문이 ID 값을 생성하는 삽입 작업을 수행하는 트리거를 하나 이상 실행하는 경우 문 바로 다음에 @@IDENTITY를 호출하면 트리거로 생성된 마지막 ID 값이 반환됩니다. ID 열이 있는 테이블에 대한 삽입 작업 후에 트리거가 실행되었고 이 트리거가 ID 열이 없는 다른 테이블에 삽입을 수행하는 경우 @@IDENTITY는 첫 번째 삽입의 ID 값을 반환합니다. INSERT나 SELECT INTO 문 또는 대량 복사가 실패했거나 트랜잭션이 롤백된 경우 @@IDENTITY 값은 이전 설정으로 되돌아가지 않습니다.

문 및 트랜잭션이 실패하면 테이블의 현재 ID가 변경되고 ID 열 값 간에 간격이 생성될 수 있습니다. 테이블에 값을 삽입하려고 시도한 트랜잭션이 커밋되지 않아도 ID 값은 롤백되지 않습니다. 예를 들어 IGNORE_DUP_KEY 위반으로 인해 INSERT 문이 실패할 경우 테이블의 현재 ID 값은 여전히 증가합니다.

@@IDENTITY, SCOPE_IDENTITY 및 IDENT_CURRENT는 모두 테이블의 IDENTITY 열에 삽입된 마지막 값을 반환한다는 점에서 서로 비슷한 함수입니다.

@@IDENTITY와 SCOPE_IDENTITY는 현재 세션의 테이블에서 생성된 마지막 ID 값을 반환합니다. 그러나 SCOPE_IDENTITY는 현재 범위 내에서만 값을 반환합니다. @@IDENTITY는 특정 범위로 제한되지 않습니다.

IDENT_CURRENT는 범위 및 세션으로 제한되지 않고 지정된 테이블로 제한됩니다. IDENT_CURRENT는 모든 세션과 범위에 있는 특정 테이블에 생성된 ID 값을 반환합니다. 자세한 내용은 IDENT_CURRENT(Transact-SQL)를 참조하십시오.

@@IDENTITY 함수의 범위는 이 함수를 실행 중인 로컬 서버의 현재 세션입니다. 이 함수는 원격 서버 또는 연결된 서버에 적용할 수 없습니다. 다른 서버의 ID 값을 가져오려면 해당 원격 서버 또는 연결된 서버에서 저장 프로시저를 실행하고 이 저장 프로시저(원격 서버 또는 연결된 서버의 컨텍스트에서 실행 중)에서 ID 값을 수집하여 로컬 서버의 호출 연결에 반환하도록 합니다.

반환 형식
numeric


다음 예에서는 ID 열(LocationID)이 있는 테이블에 행을 삽입하고 @@IDENTITY를 사용하여 새 행에 사용된 ID 값을 표시합니다.


------------------------------------------------------------------------------------------
USE AdventureWorks;
GO
--Display the value of LocationID in the last row in the table.
SELECT MAX(LocationID) FROM Production.Location;
GO
INSERT INTO Production.Location (Name, CostRate, Availability, ModifiedDate)
VALUES ('Damaged Goods', 5, 2.5, GETDATE());
GO
SELECT @@IDENTITY AS 'Identity';
GO
--Display the value of LocationID of the newly inserted row.
SELECT MAX(LocationID) FROM Production.Location;
GO
------------------------------------------------------------------------------------------


참고 항목
참조
시스템 함수(Transact-SQL)
CREATE TABLE(Transact-SQL)
IDENT_CURRENT(Transact-SQL)
INSERT(Transact-SQL)
SCOPE_IDENTITY(Transact-SQL)
SELECT(Transact-SQL)
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기

Posted by 홍반장

2009/01/22 11:56 2009/01/22 11:56
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/3921

SET ROWCOUNT (Transact-SQL)

지정한 행 수가 반환된 후 SQL Server 가 쿼리 처리를 중지하도록 합니다.

구문

SET ROWCOUNT { number | @number_var }

주의
중요:
SQL Server 의 다음 버전에서는 SET ROWCOUNT 옵션을 사용해도 DELETE, INSERT 및 UPDATE 문에 영향을 주지 않습니다. 새 개발 작업에서는 SET ROWCOUNT 옵션을 DELETE, INSERT 및 UPDATE 문과 함께 사용하지 말고, 현재 이 옵션을 사용하는 응용 프로그램을 수정하십시오. 또한 현재 SET ROWCOUNT 옵션을 사용하는 DELETE, INSERT 및 UPDATE 문은 TOP 구문을 사용하여 다시 작성하는 것이 좋습니다. 자세한 내용은 DELETE(Transact-SQL), INSERT(Transact-SQL) 또는 UPDATE(Transact-SQL)를 참조하십시오.



원격 테이블 및 로컬 분할 뷰와 원격 분할 뷰에 대한 INSERT, UPDATE, DELETE 문에 대해서는 SET ROWCOUNT 옵션 설정이 무시됩니다.

모든 행이 반환될 수 있도록 이 옵션을 해제하려면 SET ROWCOUNT 0을 지정하십시오.

참고:
SET ROWCOUNT 옵션을 지정하면 대부분의 Transact-SQL 문이 지정한 행 수에 영향을 받게 될 때 처리를 중지합니다. 트리거 및 INSERT, UPDATE, DELETE와 같은 데이터 수정 문이 이에 포함됩니다. ROWCOUNT 옵션은 동적 커서에는 영향을 주지 않지만 키 집합 및 INSENSITIVE 커서의 행 집합을 제한합니다. 이 옵션을 사용할 때는 주의를 기울여야 하며 기본적으로 SELECT 문과 함께 사용해야 합니다.



SET ROWCOUNT 옵션은 행 개수가 더 작은 값일 경우 SELECT 문의 TOP 키워드보다 우선 적용됩니다.

INSERT, UPDATE 및 DELETE 문에서는 명시적인 TOP 식이 동일한 문에 사용될 경우 SET ROWCOUNT 옵션을 무시합니다. 여기에는 INSERT 뒤에 SELECT 절이 오는 문이 포함됩니다.

SET ROWCOUNT 옵션은 실행 시간 또는 런타임에 설정되며, 구문 분석 시에는 설정되지 않습니다.

인수

------------------------------------------------------------------------------------------
number | @number_var
------------------------------------------------------------------------------------------

특정 쿼리를 중지하기 전에 처리된 행의 수(정수)입니다.

사용 권한
public 역할의 멤버 자격이 필요합니다.


SET ROWCOUNT는 지정한 행 수 이후에는 처리를 중지합니다. 다음 예에서는 545개 행이 300보다 작은 Quantity 조건과 일치합니다. 그러나 업데이트를 통해 반환된 행 수를 보면 일부 행이 처리되지 않은 것을 알 수 있습니다. ROWCOUNT는 모든 Transact-SQL 문에 영향을 줍니다.


------------------------------------------------------------------------------------------
USE AdventureWorks;
GO
SELECT count(*) AS Count
FROM Production.ProductInventory
WHERE Quantity < 300;
GO
------------------------------------------------------------------------------------------


결과 집합은 다음과 같습니다.


------------------------------------------------------------------------------------------
Count
-----------
537

(1 row(s) affected)
------------------------------------------------------------------------------------------


이제 ROWCOUNT를 4로 설정하고 Quantity가 300보다 작은 모든 행을 업데이트합니다.


------------------------------------------------------------------------------------------
SET ROWCOUNT 4;
UPDATE Production.ProductInventory
SET Quantity = 400
WHERE Quantity < 300;
GO
(4 row(s) affected)
------------------------------------------------------------------------------------------

//========================================================================================

@@ROWCOUNT(Transact-SQL)


최근 실행된 문의 영향을 받은 행 수를 반환합니다.

Transact-SQL 구문 표기 규칙

구문

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

@@ROWCOUNT

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


주의
Transact-SQL 문은 다음과 같은 방법으로 @@ROWCOUNT의 값을 설정할 수 있습니다.

● @@ROWCOUNT를 영향을 받거나 읽은 행의 수로 설정합니다. 행은 클라이언트로 전송될 수도 그렇지 않을 수도 있습니다.


● 이전에 실행한 문의 @@ROWCOUNT를 유지합니다.


● @@ROWCOUNT를 0으로 다시 설정하지만 클라이언트에게 값을 반환하지 않습니다.


단순한 할당을 수행하는 문은 항상 @@ROWCOUNT 값을 1로 설정합니다. 클라이언트에게 행은 보내지지 않습니다. 이러한 문의 예로는 SET @local_variable, RETURN, READTEXT, 그리고 SELECT GETDATE() 또는 SELECT 'Generic Text'와 같이 쿼리 문이 없는 SELECT 문이 있습니다.

쿼리에서 할당을 수행하거나 쿼리에 RETURN을 사용하는 문은 @@ROWCOUNT 값을 쿼리의 영향을 받거나 쿼리가 읽은 행 수로 설정합니다. 예를 들면 SELECT @local_variable = c1 FROM t1과 같습니다.

DML(데이터 조작 언어) 문은 @@ROWCOUNT 값을 쿼리의 영향을 받는 행 수로 설정하고 해당 값을 클라이언트에 반환합니다. DML 문은 클라이언트에게 행을 보내지 않을 수도 있습니다.

DECLARE CURSOR와 FETCH는 @@ROWCOUNT 값을 1로 설정합니다.

EXECUTE 문은 이전 @@ROWCOUNT를 유지합니다.

USE, SET
2009/01/22 11:49 2009/01/22 11:49
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/3920

[MS-SQL] ERROR_LINE(Transact-SQL)

TRY...CATCH 구문의 CATCH 블록 실행을 유발한 오류가 발생한 줄 번호를 반환합니다.

구문

ERROR_LINE()


반환 값
CATCH 블록에서 호출된 경우 다음을 반환합니다.

오류가 발생한 줄 번호를 반환합니다.


오류가 저장 프로시저 또는 트리거에서 발생한 경우 루틴 내의 줄 번호를 반환합니다.


CATCH 블록 외부에서 호출된 경우 NULL을 반환합니다.

주의
이 함수는 CATCH 블록 내의 어떤 위치에서도 호출할 수 있습니다.

ERROR_LINE은 호출 횟수 또는 CATCH 블록 내에서 호출된 위치에 관계 없이 오류가 발생한 줄 번호를 반환합니다. 이것은 오류가 발생한 문 바로 다음 문 또는 CATCH 블록의 첫 번째 문에 오류 번호를 반환하는 @@ERROR와 대조적입니다.

CATCH 블록이 중첩된 경우 ERROR_LINE은 참조되는 CATCH 블록의 범위에 해당하는 오류 줄 번호를 반환합니다. 예를 들어 TRY...CATCH 구조의 CATCH 블록에는 중첩된 TRY...CATCH 구문이 포함될 수 있습니다. 중첩된 CATCH 블록 내에 있는 ERROR_LINE은 중첩된 CATCH 블록을 호출한 오류의 줄 번호를 반환합니다. 외부 CATCH 블록에서 ERROR_LINE을 실행하면 해당 CATCH 블록을 호출한 오류의 줄 번호를 반환합니다.

반환 형식
INT


1. CATCH 블록에서 ERROR_LINE 사용
다음 코드 예에서는 0으로 나누기 오류를 생성하는 SELECT 문을 보여 줍니다. 오류가 발생한 줄 번호가 반환됩니다.

------------------------------------------------------------------------------------------
USE AdventureWorks;
GO

BEGIN TRY
-- Generate a divide-by-zero error.
SELECT 1/0;
END TRY
BEGIN CATCH
SELECT ERROR_LINE() AS ErrorLine;
END CATCH;
GO
------------------------------------------------------------------------------------------


2. 저장 프로시저의 오류 줄 번호 반환을 위해 CATCH 블록에서 ERROR_LINE 사용
다음 코드 예에서는 0으로 나누기 오류를 생성하는 저장 프로시저를 보여 줍니다. ERROR_LINE은 오류가 발생한 저장 프로시저의 줄 번호를 반환합니다.


------------------------------------------------------------------------------------------
-- Verify that the stored procedure does not already exist
IF OBJECT_ID ( 'usp_ExampleProc', 'P' ) IS NOT NULL
DROP PROCEDURE usp_ExampleProc;
GO

-- Create a stored procedure that
-- generates a divide-by-zero error.
CREATE PROCEDURE usp_ExampleProc
AS
SELECT 1/0;
GO

BEGIN TRY
-- Execute the stored procedure inside the TRY block.
EXECUTE usp_ExampleProc;
END TRY
BEGIN CATCH
SELECT ERROR_LINE() AS ErrorLine;
END CATCH;
GO
------------------------------------------------------------------------------------------


3. CATCH 블록에서 다른 오류 처리 도구와 함께 ERROR_LINE 사용
다음 코드 예에서는 0으로 나누기 오류를 생성하는 SELECT 문을 보여 줍니다. 오류가 발생한 줄 번호와 함께 오류에 관련된 정보가 반환됩니다.


------------------------------------------------------------------------------------------
USE AdventureWorks;
GO

BEGIN TRY
-- Generate a divide-by-zero error.
SELECT 1/0;
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() AS ErrorState,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_LINE() AS ErrorLine,
ERROR_MESSAGE() AS ErrorMessage;
END CATCH;
GO
------------------------------------------------------------------------------------------


참고 항목
참조
TRY...CATCH(Transact-SQL)
ERROR_NUMBER(Transact-SQL)
ERROR_MESSAGE(Transact-SQL)
ERROR_PROCEDURE(Transact-SQL)
ERROR_SEVERITY(Transact-SQL)
ERROR_STATE(Transact-SQL)
RAISERROR(Transact-SQL)
@@ERROR(Transact-SQL)

관련 자료
Transact-SQL의 오류 정보 검색
Transact-SQL에서 TRY...CATCH 사용
RAISERROR 사용
데이터베이스 엔진 오류 심각도
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기

Posted by 홍반장

2009/01/22 11:43 2009/01/22 11:43
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/3919

[MS-SQL] TRY...CATCH(Transact-SQL)

구문

---------------------------------------------------------------------------
BEGIN TRY
{ sql_statement | statement_block }
END TRY
BEGIN CATCH
{ sql_statement | statement_block }
END CATCH
[ ; ]
---------------------------------------------------------------------------

주의
TRY...CATCH 구문은 심각도가 10을 넘으며 데이터베이스 연결을 끊지 않는 모든 실행 오류를 포착합니다.

TRY 블록 다음에는 곧바로 연관된 CATCH 블록이 이어져야 합니다. END TRY와 BEGIN CATCH 문 사이에 다른 문을 두면 구문 오류가 발생합니다.

TRY...CATCH 구문은 여러 일괄 처리에 걸칠 수 없으며 또한 여러 Transact-SQL 문 블록에 걸칠 수 없습니다. 예를 들어 하나의 TRY...CATCH 구문이 두 개의 Transact-SQL BEGIN...END 블록에 걸치거나 IF...ELSE 구문에 걸칠 수 없습니다.

TRY 블록의 마지막 문을 완료할 때 TRY 블록으로 묶은 코드에 오류가 없는 경우 연관된 END CATCH 문 바로 다음 문으로 제어가 전달됩니다. TRY 블록으로 묶은 코드에 오류가 있는 경우 연관된 CATCH 블록의 첫 번째 문으로 제어가 전달됩니다. END CATCH 문이 저장 프로시저 또는 트리거의 마지막 문인 경우 해당 저장 프로시저 또는 트리거를 호출한 문으로 제어가 전달됩니다.

CATCH 블록의 코드를 완료하면 END CATCH 문 바로 다음 문으로 제어가 전달됩니다. CATCH 블록이 포착한 오류는 호출 응용 프로그램으로 반환되지 않습니다. 오류 정보를 응용 프로그램으로 반환해야 하는 경우 CATCH 블록의 코드에서 SELECT 결과 집합 또는 RAISERROR 및 PRINT 문과 같은 메커니즘을 사용하십시오. TRY...CATCH와 함께 RAISERROR를 사용하는 방법은 Transact-SQL에서 TRY...CATCH 사용을 참조하십시오.

TRY...CATCH 구문은 중첩할 수 있습니다. TRY 블록 또는 CATCH 블록은 중첩된 TRY...CATCH 구문을 포함할 수 있습니다. 예를 들어 CATCH 블록에 TRY...CATCH 구문을 포함하여 CATCH 코드가 발견하는 오류를 처리할 수 있습니다.

CATCH 블록에서 발견되는 오류는 다른 곳에서 발생한 오류와 같이 취급됩니다. CATCH 블록이 중첩된 TRY...CATCH 구문을 포함하는 경우 중첩된 TRY 블록에서 오류가 발생하면 중첩된 CATCH 블록으로 제어가 전달됩니다. 중첩된 TRY...CATCH 구문이 없는 경우 호출자로 오류가 다시 전달됩니다.

TRY...CATCH 구문은 TRY 블록의 코드가 실행한 저장 프로시저 또는 트리거에서 처리되지 않은 오류를 포착합니다. 또는 저장 프로시저나 트리거 자체에 코드에서 발생한 오류를 처리할 수 있도록 TRY...CATCH 구문을 포함할 수 있습니다. 예를 들어 TRY 블록이 저장 프로시저를 실행하고 해당 저장 프로시저에서 오류가 발생하는 경우 다음과 같은 방법으로 오류를 처리할 수 있습니다.

저장 프로시저가 자체적인 TRY...CATCH 구문을 포함하지 않는 경우 오류가 발생하면 EXECUTE 문을 포함하는 TRY 블록과 연관된 CATCH 블록으로 제어가 반환됩니다.


저장 프로시저가 TRY...CATCH 구문을 포함하는 경우 오류가 발생하면 저장 프로시저의 CATCH 블록으로 제어가 전달됩니다. CATCH 블록 코드를 완료하면 해당 저장 프로시저를 호출한 EXECUTE 문 바로 다음 문으로 제어가 전달됩니다.


GOTO 문을 사용하여 TRY 또는 CATCH 블록에 진입할 수 없지만 동일한 TRY 또는 CATCH 블록 내의 레이블로 이동하거나 TRY 또는 CATCH 블록에서 나가는 것은 가능합니다.

사용자 정의 함수 내에서는 TRY...CATCH 구문을 사용할 수 없습니다.

오류 정보 검색
CATCH 블록의 범위 내에서 다음 시스템 함수를 사용하여 CATCH 블록을 실행하도록 만든 오류에 대한 정보를 얻을 수 있습니다.

● ERROR_NUMBER()는 오류 번호를 반환합니다.


● ERROR_SEVERITY()는 심각도를 반환합니다.


● ERROR_STATE()는 오류 상태 번호를 반환합니다.


● ERROR_PROCEDURE()는 오류가 발생한 저장 프로시저 또는 트리거의 이름을 반환합니다.


● ERROR_LINE()은 오류가 발생한 루틴 내의 줄 번호를 반환합니다.


● ERROR_MESSAGE()는 오류 메시지의 전체 텍스트를 반환합니다. 이 텍스트는 길이, 개체 이름 또는 시간과 같은 대체 가능한 매개 변수에 제공된 값을 포함합니다.


CATCH 블록의 범위를 벗어나 이 함수들을 호출하면 NULL이 반환됩니다. CATCH 블록의 범위 내 어디에서나 이들 함수를 사용하여 오류 정보를 검색할 수 있습니다. 예를 들어 다음 스크립트는 오류 처리 함수를 포함하는 저장 프로시저를 보여 줍니다. TRY...CATCH 구문의 CATCH 블록에서 이 저장 프로시저를 호출하면 오류에 대한 정보가 반환됩니다.
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기

Posted by 홍반장

2009/01/22 11:40 2009/01/22 11:40
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/3918

« Previous : 1 : ... 40 : 41 : 42 : 43 : 44 : 45 : 46 : 47 : 48 : ... 101 : Next »

블로그 이미지

- 홍반장

Archives

Recent Trackbacks

Calendar

«   2024/11   »
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Statistics Graph

Site Stats

Total hits:
244387
Today:
738
Yesterday:
776