삶의지혜2010/09/01 02:08

전세 -> 월세 : 전환율은 월 1%로 정도

1. 1억 전세 -> 보증금 5천만원+월세
1) 1억 - 5천만원(지급보증금) = 5천만원(미지급보증금)
2) 5천만원(미지급보증금) : 미지급보증금 5천만원에 1%를 적용
--> 50만원

2. 1억 전세 -> 보증금 3천만원+월세
1) 1억 - 3천만원 = 7천만원
2) 7천만원 : 1% 적용시 월차임
--> 70만원

월세 -> 전세 : 전환율은 년 12%정도

3. 보증금 4천만원+월세 60만원 -> 전세
1) 보증금 4천만원
2) 월세 60만원(1%)에 해당하는 금액 : 6천만원(100%)
--> 4천만원 + 6천만원 : 1억원

4. 보증금 3천만원+월세 30만원 -> 전세
1)보증금 3천만원
2)월차임 30만원(1%)에 해당하는 금액 : 3천만원(100%)
--> 3천만원 + 3천만원 : 6천만원

임대가 -> 전세가 환산

임대가 -> 분양가 환산

수익률 공식
((년월세료-대출이자)/(분양가-대출-임대보증금))*100

분양대금이 1억, 대출 4천만원, 이자 년280만원,
임대보증금1천만원, 월세료 60만원 일 경우
수익률 계산은
(60만원*12-280만원/1억-4천만원-1천만원)*100=8.8%


전세로 전환하는법

분양금액이 1억일 경우 분양대금의 60-80% 가량을 전세가로 책정.
경기나 지주에 따라 변동하나 일반적으로 70%로 잡음.
그러면, 전세는 7천만원. 7천만원을 기준으로 3:7, 5:5, 7:3 등
보증금과 월세 비중을 정한다.


수익률 예시)
분양가 3억인경우
융자 1억, 보증금 1억, 월세 100만원으로 정했을 경우

투자액: 1억
월 내야할 이자 : 1억*연7%/12 = 583,333원
월 소득은 : 100만원
월 수익은 : 1,000,000 - 583,333 = 416,667원
년 수익률은 (416,667 * 12)/님의 투자액 1억 = 5%
이므로 이익이 별로 없다.

이 경우 이익을 실현하기 위해 월세를 월 1.2%로 올린다든지,
아니면 보증금을 내리고 월세를 올린다든지, 바닥 권리금을 받아서
초기 투자비를 낮춘다든지 하는 방법 등이 있다.

크리에이티브 커먼즈 라이센스
Creative Commons License
2010/09/01 02:08 2010/09/01 02:08
Posted by

Leave your greetings.

DATABASE/SQLServer2010/09/01 00:07
/*
 동적 쿼리의 해결사 sp_executesql vs. exec


소개.
  Visual Basic, ASP, VB.NET에서 ADO, ADO.NET을 이용한
 Database 프로그램을 개발하는 경우    프로그램내에 SQL 구문을 문자열로
 연결한 후, 실행하도록 구성한 코드를 많이 보게 된다.

   이러한 코드 구성을 일반적으로 '동적 쿼리', '하드 코딩된 쿼리'라고
 부른다.

 ex. vb의 경우
 Dim strSQL As String

 strSQL="select orderid, orderdate, employeeid from orders"
 strSQL=strSQL+" where orderid=" & txtOrderID

 cnn.Execute strSQL

 그러나, 이러한 동적 쿼리의 사용은 가능한 배제하는 것이 권장 사항이다.
대신 SQL Server의 저장 프로시저를 이용해서, 처리 용량과 응답 속도의
향상 및 유지 보수 등, 저장 프로시저의 특징을 활용하는 것이다.

 그러나, 설계상의 문제나 또는 고객의 다양한 요구 구현 방법상의 이질적
문제로 인해서 동적 쿼리를 써야된 되는 상황이 자주 발생한다.
Q/A를 보면 질문의 유형 중에 이러 동적 쿼리 작성법에 대한 내용이 상당
 부분을 차지하고 있다는 사실을 통해서도 알 수가 있다.
 
 저장 프로시저를 통해서 코드를 구성하더라도, 저장 프로시저 내에서 다시
 동적 쿼리를 사용하게 되는 경우도 발생한다.
 -온라인 설명서에는 이를 '런타임 시 명령문 작성'이라고 주제를 붙여놨다-
 이 경우, SQL Server에서는 두 가지 명령을 사용할 수 있다.
 바로 sp_executesql, exec() 두 가지이다.
   
  클라이언트나 서버 사이드에서 동적 쿼리를 사용해야 하는
 상황이 되었을 때, 즉, 저장 프로시저를 직접 사용할 수 없는 상황에서는
 또 다른 해결 방법을 이용할 수 있다.

  다음 두 가지 상황에서의 해결 방법이다.

  - 클라인트 사이드에서 동적 쿼리가 필요한 경우
   ADO, ADO.NET에서는 파라미터를 가진 동적 쿼리를 지정할 수 있으며,
   일반적으로 아래와 코드 구성을 가진다.
           
   1. ADO, ODBC, Command 오브젝트 연동
     Dim strSQL As String

     strSQL="select orderid, orderdate, employeeid from orders"
     strSQL=strSQL+" where orderid = ?"

   2. ADO.NET, SqlClient 네임스페이스, SqlCommand 오브젝트와 연동
     Dim strSQL As String

     strSQL="select orderid, orderdate, employeeid from orders"
     strSQL=strSQL+" where orderid = @orderid"

  위에 코드를 실행하면 실제 SQL Server에서는 sp_executesql 시스템
 프로시저를 통해서 실행이 된다.
 특히 ADO.NET의 경우는 디자인 타임에 'SqlDataAdapter Configuration
 Wizard'를 사용하게 되면 위와 같은 코드를 작성해 준다.


  - SQL Server, 저장 프로시저에서 동적 쿼리가 필요한 경우
   exec() 아니라 sp_executesql 시스템 프로시저를 이용한다.

 결국, 클라이언트 사이드건 서버 사이드건 sp_executesql 이 사용되는 것을
알 수 있다.
 exec()를 쓴 경우와 sp_executesql를 사용한 경우의 성능과 SQL Server의
Cache 매니저의 상황 비교에 대한 내용을 마지막에 추가해 두었다.

 일반적으로 sp_executesql은 exec() 비해 몇 가지 추가 장점을 제공한다.

  - 쿼리문안에 매개변수(입력/출력)를 정의할 수 있다.
  - 매개변수 사용으로 인해 쿼리 최적화 프로그램이 컴파일된 실행 플랜을
   재 사용할 확률이 높아진다.

 실제로, exec()와 sp_executesql은 Cache 매니저의 처리 방법 및 활동 상태가
다르다는 것을 마지막에 추가한 성능 모니터링을 통해서 알 수가 있을 것이다.

 이번 기회의 sp_executesql 시스템 프로시저 다양한 사용법과 관련 지식을 얻는데
미력하나마 도움이 되었으면 한다.
 그럼, 구문부터 살펴보자.    


구문.

 sp_executesql [@stmt =] stmt
 [
   {, [@params =] N'@parameter_name  data_type [,...n]' }
   {, [@param1 =] 'value1' [,...n] }
 ]

 인수설명.
  @stmt: T-SQL문 또는 배치 명령. ntext 형으로 변환될 수 있는
      변수 또는 유니코드 상수 문자열.
      내부에 @name 형식의 파라미터를 포함할 수 있다.

   @params: @stmt에 포함된 모든 파라미터의 이름과 데이터 타입을 정의한다.
   @param1: @params 파라미터에서 첫번째 파라미터에 할당할 값
   n : 각 파라미터에 대한 값을 할당한다.


참고.
  - UNICODE 문자열 상수를 지정할 때는 N'...'형식을 사용한다.
 sp_executesql 프로시저에 선언되어 있는 파라미터가 ntext형이기 때문에 문자열을
 직접 지정하실 때는 위와 같은 형태를 사용하시면 됩니다.

  - sp_executesql은 sql로 구성된 시스템 프로시저가 아니라, 확장 프로시저이다.
*/



/*
기본 예제.  
    TOP 절의 값을 동적으로 지정하고자 하는 경우
    (아래 구문은 set rowcount n 세션 옵션으로 대치할 수도 있다.)
*/
    declare @cnt as nvarchar(5)
    declare @stmt as nvarchar(100)
    set @cnt = '5'
    set @stmt = 'select top ' + @cnt + ' * from northwind.dbo.orders'
   
    exec sp_executesql @stmt



/*
기본 예제.  
    단순히 SQL을 동적으로 작성하고자 하는 경우로, @db의 값이 실행 시마다
    다른 데이터베이스명이 올 수 있다고 가정한다. 테이블명은 동일한다.
*/
    declare @db as nvarchar(20)
    declare @stmt as nvarchar(100)
    set @db = 'northwind'
    set @stmt = 'select * from '+ @db +'.dbo.orders'
   
    exec sp_executesql @stmt



/*
기본 예제.  
    하나 이상의 명령을, 배치로 실행
*/
    declare @stmt as nvarchar(500)
    set @stmt = 'use northwind; '
    set @stmt = @stmt + 'select top 5 * from dbo.orders where
orderid=10248; '
    set @stmt = @stmt + 'select top 5 * from dbo.[order details] where
orderid=10248'
   
    exec sp_executesql @stmt


/*
입력 파라미터를 적용한 예제.  

    @orderid 입력 파라미터를 이용해서 해당 주문 번호를 가진
 [order details] 테이블의 주문 제품 정보를 출력
*/
    use northwind

    declare @stmt as nvarchar(100)
    declare @params as nvarchar(100)
    set @stmt = 'select productid, quantity, unitprice from '
  set @stmt = @stmt + 'dbo.[order details] where orderid=@orderid'
    set @params = '@orderid int'
   
    exec sp_executesql @stmt, @params, @orderid=10248


/*
입력 파라미터를 적용한 예제.  

    위 예제를 실제로 저장 프로시저 안에서 연동한 경우.
*/
    use northwind

    create proc upOrderDetailsSel
        @porderid    int
    as
        declare @stmt as nvarchar(100)
        declare @params as nvarchar(100)
        set @stmt = 'select productid, quantity, unitprice from '
      set @stmt = @stmt + 'dbo.[order details] where orderid=@orderid'
        set @params = '@orderid int'
       
        exec sp_executesql @stmt, @params, @orderid=@porderid
    go
    exec upOrderDetailsSel @porderid = 10248



/*
input 파라미터를 적용한 예제.  

    @table을 입력 파라미터를 이용해서 실제 입력할 대상 테이블을 결정,
    입력될 컬럼값들 또한 입력 파라미터로 처리한 예제.

*/
    -- 아래 테스트용 테이블을 우선 작성할 것.
    create table northwind.dbo.table1 (
        a    int
    ,    b int
    , c int
    )

    use northwind

    declare @table as nvarchar(20)
    declare @stmt as nvarchar(100)
    declare @params as nvarchar(100)

    set @table = 'dbo.table1'
    set @stmt = 'insert into ' + @table + ' '
  set @stmt = @stmt + 'values (@a, @b, @c)'
    set @params = '@a int, @b int, @c int'
   
    exec sp_executesql @stmt, @params, @a=1, @b=2, @c=3

    -- 확인    
    select * from table1



/*
output 파라미터를 적용한 예제.  

     동적 SQL문 내에도 출력(OUTPUT) 파라미터를 선언하고
    결과 값을 리턴 받을 수 있다. 저장 프로시저에서 출력 파라미터를
    사용하는 것과 동일하게, 선언부와 호출부에 반드시 OUTPUT 키워드를
    지정한다.
*/
    use northwind

    declare @stmt as nvarchar(100)
    declare @params as nvarchar(100)
    declare @orderret as int

    set @stmt = 'select @ordercnt = count(*) from dbo.orders'
    set @params = '@ordercnt as int OUTPUT' -- OUTPUT 키워드에 주의

    -- 여기도 OUTPUT 키워드를 지정한다.
    exec sp_executesql @stmt, @params, @ordercnt = @orderret OUTPUT

    -- 확인    
    select @orderret




/*
이런 것은 지원이 안된다.

 *. sp_executesql은 배치, 저장 프로시저, 트리거처럼 한 배치로 실행된다.

 1. 동적 SQL문에서는 RETURN 문을 사용할 수 없다.

 2. 로컬 변수를 액세스 할 수 없다.
    declare @chr char(3)
    set @chr = 'abc'
   
    sp_executesql N'PRINT @CharVariable'
    GO

 3. 현재 데이터베이스가 변경되지 않는다.
    use pubs
    go
    sp_executesql N'use northwind'
    select * from shippers    -- shippers 테이블은 northwind에 있다.
    go

*/


/*
전문 개발자및 관리자를 위한 추가 정보

성능 비교.
    만일, 여러분이 Windows NT/2000의 성능 모니터의 사용법을 알고 있다면,
 아래 3가지 사용 예에 대한 모니터를 수행하고 각각 Cache Manager상의
 활동이 어떻게 다른지를 비교 해 보면 많은 도움이 될 것이다.
   
  아래에 성능 모니터에 모니터링할 관련 오브젝트 및 카운트을 적어 두었다.
        성능 개체
            SQL Server:Cache Manager
                - 모든 카운터
                - 다음 목록에서 인스턴스 선택
                    _Total
                    Adhoc Sql Plans
                    Execution Context
                    Procedure Plans
                    기타... (관심이 있다면)    
               

    참고.
        3개의 방법을 개별적으로 테스트할 때, Procedure Cache상에 동일한
    플랜이 재 사용되는 것을 방지하기 위해

        DBCC FREEPROCCACHE

     명령을 사용할 수 있다.
    이 명령은 프로시저 캐시에서 모든 요소를 제거한다.
  이 작업을 해 주어야, Cache Object Counter가 늘어나는 것을 볼 수 있다.

        그리고, 현재 Cache된 Object에 대한 정보를 보고자 하는 경우 아래

    쿼리를 이용하면 된다.
       
        select * from master..syscacheobjects
            where dbid = db_id('northwind')



1. 저장 프로시저 테스트용
    -- DROP PROC dbo.upOrderDetailsQuery
    CREATE PROC dbo.upOrderDetailsQuery
    @orderid int
    AS
        select productid, quantity, unitprice from dbo.[order details]
        where orderid = @orderid
    go

    EXEC dbo.upOrderDetailsQuery @orderid = 10248



2. sp_executesql

    USE Northwind

    declare @stmt as nvarchar(100)
    declare @params as nvarchar(100)
    set @stmt = 'select productid, quantity, unitprice from '
  set @stmt = @stmt + 'dbo.[order details] where orderid=@orderid'
    set @params = '@orderid int'
   
    exec sp_executesql @stmt, @params, @orderid=10248
    go
       


3. EXEC() 사용

    USE Northwind

    declare @stmt as nvarchar(100)
    declare @orderid varchar(10)
    set @orderid = '10248'
    set @stmt = 'select productid, quantity, unitprice from '
  set @stmt = @stmt + 'dbo.[order details] where orderid = '+ @orderid
       
    EXEC (@stmt)

*/

출처 : http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=39&MAEULNo=16&no=384&ref=201

크리에이티브 커먼즈 라이센스
Creative Commons License
2010/09/01 00:07 2010/09/01 00:07
Posted by

Leave your greetings.

DATABASE/SQLServer2010/08/31 10:17
TRY..CATCH를 이용한 중첩 트랜잭션 예외처리.  

개요.

TRY .. CATCH 구문 내에서의 트랙잭션 처리에 대해 어떻게 구현되는지 알아보는 것과 트랜잭션으로 처리하는 프로시저 내에서

다시 트랜잭션으로 처리하는 프로시저를 호출 시 제대로 작동하는지 확인하는 것이 이 문서의 목적입니다.


테스트 샘플.


테스트 샘플은 분모를 파라미터로 받아서 0을 제외한 값은 에러가 나지 않고 0인 값은 에러가 나는 예제입니다.



1. 테스트 테이블 생성

CREATE TABLE TryTest
(
       id1 int,
       id2 int
)

2. 부모 프로시저 작성.

CREATE PROCEDURE ParentTest

(
       @bunmo int
)
AS

BEGIN
SET NOCOUNT ON;

       BEGIN TRY

             BEGIN TRAN ParentTest1

                    INSERT INTO TryTest VALUES(2,1)

                    EXEC ChildTest @bunmo

                    PRINT('ParentTest')

                    INSERT INTO TryTest VALUES(2,2)

             COMMIT TRAN ParentTest1

       END TRY
       BEGIN CATCH

             ROLLBACK TRAN ParentTest1
             PRINT('Parent ERROR')

       END CATCH

       SET NOCOUNT OFF;

END 

3. 자식 프로시저 작성.

CREATE PROCEDURE ChildTest ( 
       @bunmo int
)

AS

BEGIN

SET NOCOUNT ON;

       BEGIN TRY

             BEGIN TRAN ChildTest1
                    INSERT INTO TryTest VALUES(1,1)
                    PRINT(1/@bunmo)
                    INSERT INTO TryTest VALUES(1,2)
                    COMMIT TRAN ChildTest1
       END TRY

       BEGIN CATCH
             ROLLBACK TRAN ChildTest1
             PRINT('Child ERROR')
       END CATCH

       SET NOCOUNT OFF;

END

4. 실행.

4.1. 에러 발생 시

EXEC ParentTest 0

실행 결과 : Parent ERROR
데이터 결과 : 데이터 쌓이지 않음.

흐름.

ParentTest
프로시저에 2,1 데이터를 등록 ChildTest 프로시저를 실행합니다.
ChildTest 내에서 1,1 인서트 0으로 나누려 했기 때문에 CATCH 구문으로 이동하여 롤백합니다.
'Child ERROR'
출력하지 않는 이유는 ROLLBACK TRAN ChildTest1 시점에 프로시저를 벗어나기 때문입니다.
다시 ParentTest으로 넘어온 ParentTest 출력하지 않고
부모에서 ROLLBACK 되었기 때문에
바로 CATCH 구문으로 이동합니다.
롤백 처리한 'Parent ERROR' 출력합니다.
결국 Parent, Child 모두 롤백되므로 인서트된 데이터들은 없습니다.

4.2. 정상 실행 시

EXEC ParentTest 1

실행 결과 :

1

ParentTest

데이터 결과 : 4건 등록됨.
2         1
1         1
1         2
2         2


흐름.
ParentTest 프로시저에 2,1 데이터를 등록 ChildTest 프로시저를 실행합니다.
ChildTest 내에서 1,1 인서트 1 나누려 했기 때문에 CATCH 구문으로 이동하지 않고 1,2 인서트 합니다.
트랜잭션을 COMMIT 시킨 Parent 돌아와서 ParentTest’ 출력 2,2 인서트하고 COMMIT 시킵니다.
 

5. 결론

TRY..CATCH 이용하여 중첩 프로시저 호출로 인한 트랜잭션 처리는 데이터 무결성을 보장합니다.

출처 : http://www.mobilepro.pe.kr/trackback_post_122.aspx

크리에이티브 커먼즈 라이센스
Creative Commons License
2010/08/31 10:17 2010/08/31 10:17
Posted by
Tags

Leave your greetings.