'SQL Server'에 해당되는 글 8건

Programming/Microsoft SQL Server
Sql Sever 2008을 설치하려고 하면 다음과 같이 "구성 시스템 구성을 초기화하지 못했습니다."라는 오류가 날 수 있습니다.


이런 경우에는 냉큼 "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG"로 이동하여 "machine.config.default" File을 "machine.config"이름으로 바꾸어 줍니다.

'Programming > Microsoft SQL Server' 카테고리의 다른 글

[SQL] Identity  (0) 2010.07.20
[SQL] Data 집계하기  (0) 2010.07.19
[SQL] 0x84B10001 오류  (0) 2010.06.09
[SQL] Link Server의 Data조회 관련 오류  (0) 2010.06.02
우편번호 DB (MSSQL)  (0) 2010.05.07
[SQL Server] - Sample Database 설치  (0) 2010.05.06
0 0
Programming/Microsoft SQL Server
하위Query는 Query문 안에 또다른 Select Query문이 존재하는 것을 말합니다.(이런 Query는 다른말로 내부Query 라고도 하며 반면 하위Query를 포함하고 있는 Query를 외부Query라고 합니다.)

이런한 구조의 Query는 하위에서 Query가 수행될때마다 하나의 값만을 반환해야 합니다.

1. 하나의 열처럼 조회

Select B.BusinessEntityID, (Select Name From HumanResources.Department As A Where A.DepartmentID = B.DepartmentID)
From HumanResources.EmployeeDepartmentHistory As B

HumanResources.EmployeeDepartmentHistory Table을 조회할때 DepartmentID에 따른 Name값은 하위 Query를 통해 조회합니다.


만일 DepartmentID값에 따라 같은 Name이 존재한다면 처리가 곤란해 지게 되고 당연히 오류를 발생시키게 됩니다. 따라서 하위Query에서는 하나의 값만 발생시켜야 된다는 점을 유념하시기 바랍니다.
또한 하위Query 사용시에는 반드시 괄호를 통해 하위Query를 구분해 줘야 합니다.

(Select Name From HumanResources.Department As A Where A.DepartmentID = B.DepartmentID)

2. 조건지정

Select FirstName, MiddleName, LastName
From Person.Person
Where BusinessEntityID = (Select BusinessEntityID From Person.PersonPhone Where PhoneNumber = '815-555-0138')

Person.Person Table의 FirstName, MiddleName, LastName을 조회하되 BusinessEntityID가 Person.PersonPhone Table에서 PhoneNumber가 '815-555-0138'에 해당하는 Name만 조회합니다.


만일 조건처럼 사용된 하위Query에서 여러개의 값을 반환하는 경우에는 = 대신 In을 사용하여 지정하도록 합니다.

Select FirstName, MiddleName, LastName
From Person.Person
Where BusinessEntityID In (Select BusinessEntityID From Person.PersonPhone Where PhoneNumberTypeID = 3)

하위Query에서 반환하는 모든 값이 BusinessEntityID와 일치하는 FirstName, MiddleName, LastName만 조회합니다.


3. 하위Query를 Table처럼 사용하기

하위Query전체를 열이나 조건식이 아닌 하나의 Table처럼 사용하여 조회할 수도 있으며 이때 외부Query에서는 하위Query에서 조회된 결과를 다시 재 가공하여 출력시킬 수도 있습니다.

Select Count(Color), Sum(A.Price)
From (Select Color, Sum(ListPrice) As Price From Production.Product Group By Color) As A

하위Query에서는 Production.Product Table의 Color에 따라 ListPrice값의 합계를 구하고 외부Query에서는 하위Query에서 구해진 ListPrice의 전체합과 Color별 행수를 구하도록 합니다.


그런데 하위Query만 따로 실행해 보면

Select Color, Sum(ListPrice) As Price From Production.Product Group By Color


전체 ListPrice의 합계는 외부Query에서 구해진게 맞지만 Color에 대한 행수는 10행에 불과합니다. 이는 외부Query에서 Color의 Count를 구할때 Null값은 제외하였기 때문입니다.

4. 상관하위Query

위에서 언급한 하위Query는 Query동작의 순서상 하위Query가 먼저 실행된 후 그 실행을 토대로 외부Query가 동작하는 방식이었으며 또한 외부Query와 하위Query가 같이 존재한다 하더라도 하위Query만 독립적으로 동작하는 것이 가능했습니다.

하지만 상관하위Query는 일반 하위Query처럼 독립적으로 실행하는 것도 불가능하고 동작순서도 외부Query가 먼저 실행된 후 내부Query가 동작하는 특징을 갖고 있습니다.

Select ProductID, Name, ProductNumber
From Production.Product As A
Where 40 < (Select Max(ListPrice) From Production.ProductListPriceHistory As B Where A.ProductID = B.ProductID)

Production.Product Table에서 ProductID, Name, ProductNumber열을 조회하되 Production.ProductListPriceHistory의 ProductID열 ListPrice값이 최대 40이상인 것만 조회하도록 합니다.


보시는 것 처럼 하위Query와 외부Query가 서로 조건식을 통하여 연관되어 있기 때문에 내부Query만 따로 실행시킬 수는 없습니다.

동작순서 또한 외부Query에서 Production.Product Table의 ProductID, Name, ProductNumber 열값을 불러오고 이중에서 기준이 되는 ProductID값을 내부Query에게 던져 주게 됩니다. 그럼 내부 Query에서는 넘겨받은 ProductID값으로 ListPrice의 최대값을 조회하여 그 결과 값을 다시 외부Query에 넘기게 됩니다. 이때  외부 Query는 내부 Query로 부터 넘겨받은 값이 40이상인지를 판단하여 처리를 진행합니다.

이러한 특징 때문에 외부Query가 먼저 실행되어야 내부Query가 작동할 수 있는 것입니다.

참고:
상관하위 Query가 동작하는 단위는 Table전체 단위가 아닌 행단위로 이루어 지게 됩니다. 그렇기 때문에 외부Query에서 조회하는 행이 크면 클수록 내부 Query에서 조회할때 조건을 비교하므로 시간이 오래 걸릴 수 있습니다.

하위Query에서 보시면 ListPrice값을 조회할때 Max함수를 써서 최대값만을 가져오도록 했습니다. 이는 Production.ProductListPriceHistory Table에 하나의 ProductID별로 여러건의 데이터가 존재하기 때문입니다. 즉, 값을 2개이상 반환하면 오류를 일으키게 되므로 주의하시기 바랍니다.

'Programming > Microsoft SQL Server' 카테고리의 다른 글

[SQL] 시간관련 형식 변환  (0) 2010.04.30
[SQL] Table 조회시 합계 표시하기  (0) 2010.04.26
[SQL] 하위 Query(Sub Query)  (0) 2010.04.21
[SQL] 흐름제어 구문  (0) 2010.04.08
[SQL] 데이터(Data) 형식  (2) 2010.04.01
[SQL] Table Join  (3) 2010.03.31
0 0
Programming/Microsoft SQL Server
1. Begin/End

연관된 여러 Query를 그룹화 합니다. 이는 비슷하거나 같은 목적별로 작동하는 Query를 묶어 관리를 용이하게 합니다.

Begin
     Select * From HumanResources.Department;
     Select * From HumanResources.Employee;
End

2. While

조건에 따라 Query를 반복 실행합니다.

Declare @i Int;
Set @i = 1

While(@i <= 5)
Begin
 Select *
 From HumanResources.Department
 Where DepartmentID = @i;
 
 Set @i = @i + 1;
End


정수형 변수  @i를 선언하고 초기값을 1로 해준 후 @i값이 5와 같거나 미만인 경우에만 Begin/End 사이의 Query를 수행하도록 합니다.


3. Continue

Continue를 While문에 포함시키면 해당 구문이 들어간 위치이하의 Query실행을 건너뛸 수 있습니다.

Declare @i Int;
Set @i = 1

While(@i <= 5)
Begin
 If (@i = 4)
 Begin
  Set @i = @i + 1;
  Continue;
 End
 
 Select *
 From HumanResources.Department
 Where DepartmentID = @i;
 
 Set @i = @i + 1;
End


정수형 변수 @i를 선언하고 초기값을 1로 하였습니다. 이때 @i값이 5와 같거나 미만인 경우에만 Begin/End 사이의 Query를 수행하도록 합니다.

단, If문을 통하여 @i가 4인 경우에는 Continue문으로 실행을 건너 뛰도록 합니다.


4. Break

Break를 While에 포함시키면 해당 구문이 들어간 위치이하의 Query실행을 취소할 수 있습니다.

Declare @i Int;
Set @i = 1

While(@i <= 5)
Begin
 If (@i = 4)
 Begin
  Set @i = @i + 1;
  Break;
 End
 
 Select *
 From HumanResources.Department
 Where DepartmentID = @i;
 
 Set @i = @i + 1;
End


If문에서 Continue대신 Break문을 삽입하였습니다. Break는 재실행 없이 While문 전체를 취소합니다.


5. Waitfor

지정한 특정시간에 또는 해당 시간만큼 대기한 후 Query를 실행합니다.

Waitfor Delay '00:00:05'
Begin
 Select * From HumanResources.Department;
End

약 5초간 대기한 후 Query를 실행합니다.


실행 결과를 보면 Query실행 시간이 00:00:05 라고 표시되어 있음을 확인할 수 있습니다.

Waitfor Time '19:15:00';
Begin
 Select * From HumanResources.Department;
End

오후 07시 15분이 되면 Query를 실행합니다.


6. Return

Query의 실행을 종료합니다. 숫자나 문자열을 인수로 지정하면 해당 값을 반환값으로 얻을 수 있습니다.

Select * From HumanResources.Department;
Return;
Select * From HumanResources.Employee;

Return이하 Query문은 실행하지 않고 종료합니다. (또 다른 종료 구문인 Break는 While등의 반복문 안에서만 유효합니다.)


7. IF

Query수행에 따른 조건을 지정할 수 있습니다.

Declare @i Int;
Set @i = 2;

If (@i = 1)
Begin
 Select * From HumanResources.Department;
End
Else If (@i = 2)
Begin
 Select * From HumanResources.Employee;
End
Else
Begin
 Select * From HumanResources.EmployeeDepartmentHistory;
End


변수 @i값에 따라 1이면 Select * From HumanResources.Department문을 2면 Select * From HumanResources.Employee문을 그외 다른 값이면 Select * From HumanResources.EmployeeDepartmentHistory문을 실행합니다.

▶ Set을 통해 2의 값을 넣었으므로 If문의 조건에 따라 Select * From HumanResources.Employee문이 수행되었습니다.

조건지정에서는 처음 If문과 그 다음 Else If문을 통하여 각기 다른 값에 따라 처리를 달리할 수 있습니다. 또한 If와 그 외 모든 Else If의 조건에 부합하지 않을 경우에는 Else문을 통하여 별도의 처리를 지정할 수도 있습니다.

8. Goto

Query수행에 대한 분기 명령으로 원하는 지점부터 Query수행을 지시할 수 있습니다.

Declare @i Int;
Set @i = 3;

If (@i = 1)
Begin
 Goto Squery_rtn1;
End
Else If (@i = 2)
Begin
 Goto Squery_rtn2;
End
Else
Begin
 Goto Squery_rtn3;
End

Squery_rtn1:
Begin
 Select * From HumanResources.Department;
End
Return;

Squery_rtn2:
Begin
 Select * From HumanResources.Employee;
End
Return;

Squery_rtn3:
Begin
 Select * From HumanResources.EmployeeDepartmentHistory;
End
Return;


변수 @i값에 따라 Query를 수행할 분기점이 달라지도록 하였습니다.(만일 @i값이 2이면 Squery_rtn2지점으로 jump하여 Return까지 모든 Query를 수행합니다.)

분기할 지점은 'Goto [분기할 이름]'의 형식으로, 실제 분기 지점은 '[분기할 이름]:'형식(반드시 이름 끝에 : 문자가 붙어야 합니다.!)으로 지정합니다.

주의: Goto문으로 실행 분기점을 지정한다는 것은 해당 지점부터 이하 모든 Query수행을 의미합니다.
즉, '해당 지점만'실행한다는 의미가 아니므로 원하는 분기지점만 수행을 원할경우 분기점마지막에 반드시 Return을 넣어 주도록 합니다.

Squery_rtn2:
Begin
 Select * From HumanResources.Employee;
End
Return;

Return문이 존재하지 않으면 실행분기점이 Squery_rtn2지점일때 Squery_rtn2뿐만 아니라 Squery_rtn3지점까지도 모두 실행하게 됩니다.

▶ @i변수에 3이 지정되어 Squery_rtn3: 으로 실행지점이 분기되었습니다.

'Programming > Microsoft SQL Server' 카테고리의 다른 글

[SQL] Table 조회시 합계 표시하기  (0) 2010.04.26
[SQL] 하위 Query(Sub Query)  (0) 2010.04.21
[SQL] 흐름제어 구문  (0) 2010.04.08
[SQL] 데이터(Data) 형식  (2) 2010.04.01
[SQL] Table Join  (3) 2010.03.31
Microsoft SQL Server 설치  (0) 2010.03.25
0 0
Programming/Microsoft SQL Server
Table을 Join한다는 것은 두개 이상의 Table을 하나로 묶어서 조회하는 것을 의미합니다.

1. Inner Join

Join된 테이블에서 on조건에 해당하는 것만을 조회합니다.

Select BusinessEntityID, A.DepartmentID, Name, GroupName
From HumanResources.EmployeeDepartmentHistory As A Inner Join HumanResources.Department As B
On A.DepartmentID = B.DepartmentID
Order By DepartmentID

HumanResources.EmployeeDepartmentHistory Table과 HumanResources.Department Table을 Join하여 각 Table의 DepartmentID가 같은것만을 대상으로(On절) 조회합니다. 이때 HumanResources.EmployeeDepartmentHistory Table의 BusinessEntityID와 DepartmentID 그리고 HumanResources.Department Table의 Name과 GroupName을 조회 대상으로 합니다.


위의 Query에서 HumanResources.EmployeeDepartmentHistory As A 부분과 HumanResources.Department As B에서의 As는 각 Table에 이름을 지정한 것입니다. 즉 HumanResources.EmployeeDepartmentHistory Table의 이름을 A라 하고 HumanResources.Department Table의 이름을 B라고 정의한 것이죠.

이렇게 정의된 이름은 Select 구문에서 처럼 A.DepartmentID 라고 작성하여 A Table에 있는 DepartmentID열을 가져온다고 명시하고 있습니다.

그렇다면 왜 이름을 정의하는 것이 필요할까요?

이름을 지정해 주지 않으면 On으로 조건을 지정할때나 특정 열을 조회할때 Join된 Table각각에서 공통된 열이름이 존재할 경우 "어떤 Table의 열을 가져와야 하는가?"라는 문제가 발생하게 됩니다.

위 예제에서도 HumanResources.EmployeeDepartmentHistory Table과 HumanResources.Department Table은 공통적으로 DepartmentID열을 가지고 있는데 이때 On에서 On DepartmentID = DepartmentID 라고만 하게 되면 각각 어떤 Table에 있는 DepartmentID열을 의미하는지 알 수 없게 됩니다.

뿐만 아니라 Selet에서 A.DepartmentID가 아닌 DepartmentID라고만 했을 경우에도 위와 같은 똑같은 문제가 발생할 수 있는 것입니다.

따라서 이 문제를 해결하려면 각각의 Table에 이름을 지정하여 어떤 Table을 기준으로 하는지 명시함으로서 공통된 열을 구분하는 것입니다.

반면 BusinessEntityID나 Name, GroupName의 경우에는 각 Table에 중복되지 않게 존재하므로 반드시 별칭(이름) 지정이 필요하지는 않습니다.

물론 As구문을 통해서 반드시 별칭을 지정해야만 중복된 열에 대한 문제를 해결할 수 있는것은 아닙니다. 다음 예제처럼 Query처럼 작성해도 별칭을 지정한 것과 결과는 같습니다.

Select BusinessEntityID, HumanResources.EmployeeDepartmentHistory.DepartmentID, Name, GroupName
From HumanResources.EmployeeDepartmentHistory Inner Join HumanResources.Department
On HumanResources.EmployeeDepartmentHistory.DepartmentID = HumanResources.Department.DepartmentID
Order By DepartmentID

보시는 바와 같이 As를 통해 이름을 지정해 주지 않고도 중복되는 열마다 Table명칭 자체를 사용해 어떤 Table에 있는 열인지를 명확히 하고 있습니다. 하지만 이렇게 일일이 Table이름을 붙이게 되면 유지보수에도 힘들뿐더러 단순히 보기에도 매우 복잡해 보이므로(이게 좋다고 하면 할말이 없지만) 비효휼 적이라는 것을 알 수 있습니다.

참고:
Table Join에는 단순히 2개까지의 Table만 Join이 가능한 것은 아닙니다. 이론상 최대 256개 까지 가능하지만 실제로는 많아봐야 3~4개 정도의 테이블에만 Join에 사용하곤 합니다. 만일 Join대상이 그 이상이라면 Join대신 다른 방법을 찾는것이 경우에 따라 더 현명할 수 있으며 Join대상이 너무 많은 경우에는 Table 재설계를 고려해봐야 합니다.

Select A.BusinessEntityID, C.LoginID, A.DepartmentID, Name, GroupName
From HumanResources.EmployeeDepartmentHistory As A
 Inner Join HumanResources.Department As B
On A.DepartmentID = B.DepartmentID
 Inner Join HumanResources.Employee As C
On A.BusinessEntityID = C.BusinessEntityID
Order By BusinessEntityID

HumanResources.EmployeeDepartmentHistory Table과 HumanResources.Department Table을 DepartmentID별로 Join하고 다시 HumanResources.EmployeeDepartmentHistory Table과 HumanResources.Employee Table을 BusinessEntityID별로 Join합니다.


Table을 두개이상 Join할경우 On절을 통해 Join할 조건을 작성하고 그 다음 Join문에 On조건 작성을 다시 반복합니다. 또한 위와 같은 방식으로 경우에 따라 여러개의 Table을 Join할 수 있습니다.

2. Left Outer Join

Left Outer Join은 두개 이상의 Table을 조인하여 Data를 조회하되 왼쪽(Left)에 있는 Table의 내용은 모두 가져오도록 합니다. 이때 On조건에 부합하는 것은 정상적으로 조회하고 조건에 부합하지 않는 경우에는 Null로 표시됩니다.

Select A.BusinessEntityID, B.AddressID, B.AddressTypeID
From Person.Person As A Left Outer Join Person.BusinessEntityAddress As B
On A.BusinessEntityID = B.BusinessEntityID
Order By BusinessEntityID

Person.Person Table과 Person.BusinessEntityAddress Table을 BusinessEntityID별로 Join하여 조회하도록 합니다. 단 Person.Person Table의 내용은 빠짐없이 모두 가져오도록 합니다.


BusinessEntityID의 1785나 1786등의 값은 Person.BusinessEntityAddress Table에 존재하지 않기 때문에 On조건에 따라 AddressID, AddressTypeID는 조회할 수 없습니다. 하지만 Left Outer Join을 통해 Person.Person Table의 내용은 모두 가져오도록 하였으므로 표시할 수 없는 AddressID, AddressTypeID열값은 Null로 나타내는 것입니다.

또한 Left Outer Join에서 구문이 너무 길다고 생각되시면 줄여서 Left Join이라고 할 수도 있습니다.

Select A.BusinessEntityID, B.AddressID, B.AddressTypeID
From Person.Person As A Left Join Person.BusinessEntityAddress As B
On A.BusinessEntityID = B.BusinessEntityID
Order By BusinessEntityID

3. Right Outer Join

Left Outer Join과 반대로 오른쪽에 조인된 Table을 기준으로 모든 Data를 가져오도록 합니다. 물론 이때에도 표시할 수 없는 값은 null로 나타납니다.

Select A.ProductID, A.StandardCost, B.Name
From Production.ProductCostHistory As A Right Outer Join Production.Product As B
On A.ProductID = B.ProductID

Production.ProductCostHistory Table과 Production.Product Table을 ProductID별로 Join하여 조회하되 Production.Product Table의 모든행을 전부 가져오도록 합니다.


4. Full Outer Join

Full Outer Join은 간단히 말해 Left Outer Join과 Right Outer Join을 합한것입니다. 즉, 양쪽 Table의 모든 Data를 다 가져오도록 하는 것입니다. 물론 이때에도 표시할 수 없는 값은 Null이 됩니다.

Select ProductID, ProductDescriptionID, StandardCost, Description
From Production.ProductCostHistory Full Outer Join Production.ProductDescription
On ProductID = ProductDescriptionID

Production.ProductCostHistory Table과 Production.ProductDescription Table을 Join하되 양쪽 Table의 모든 행을 조회합니다.


5. Cross Join

왼쪽 Table에서 오른쪽 Table을 제곱하여 그 결과를 표시하도록 합니다. 다시 말해 왼쪽 Table 한행당 오른쪽 Table전체를 그리고 다시 왼쪽 Table 한행당 오른쪽 Table 전체... 이런한 방법으로 Join된 결과를 표시하는 것입니다.

Select A.ProductID, A.Name, StartDate, EndDate, B.StandardCost
From Production.Product As A Cross Join Production.ProductCostHistory As B
Order By A.ProductID


결과를 보시면 조회된 총 행의 갯수가 199,080행입니다. Production.Product Table의 행이 504행 Production.ProductCostHistory Table의 행이 395행이므로 199080 = 504 * 395이 되는 것입니다.

주의:
이처럼 경우에 따라 엄청난 수의 Data를 조회하므로 Cross Join 사용시 성능면에서 각별히 주의해야 합니다.

6. Salf Join

Salf Join은 단순히 자기 자신을 Join하는 경우를 말합니다. 이는 하나의 Table안에서 서로 연관된 Data를 조회하고자 할때 쓰이지만 그리 흔하게 쓰이는 방법은 아닙니다.

Select A.BusinessEntityID, A.LoginID, A.JobTitle, B.BusinessEntityID, B.LoginID, B.JobTitle
From HumanResources.Employee As A Inner Join HumanResources.Employee As B
On A.BusinessEntityID = B.OrganizationLevel
Order By A.BusinessEntityID

HumanResources.Employee Table자신을 Join하여 BusinessEntityID 열과 OrganizationLevel 열값이 같은 것끼리  조회 하도록 합니다.


7. Where 절을 이용한 Table Join

두개 이상의 Table을 Join하는데는 굳이 Join문을 이용하지 않고도 Where절을 이용하는 방법이 있습니다.

Select ProductID, ProductDescriptionID, StandardCost, Description
From Production.ProductCostHistory, Production.ProductDescription
Where ProductID = ProductDescriptionID

Production.ProductCostHistory Table과 Production.ProductDescription Table의 내용을 조회하되 ProductID = ProductDescriptionID같은 것만 조회하도록 합니다.

Select ProductID, ProductDescriptionID, StandardCost, Description
From Production.ProductCostHistory Inner Join Production.ProductDescription
On ProductID = ProductDescriptionID

Production.ProductCostHistory Table과 Production.ProductDescription Table을 ProductID와 ProductDescriptionID가 같은 것끼리 Join하여 조회하도록 합니다.


Where절을 이용하여 Join하고자 하는 경우에는 Join문은 쓰지 않으며 Join할 각 Table을 ,를 통해 구분하면 됩니다. 이때 사용하는 Where절은 Join시에 사용하던 On과 같은 역활을 하게 됩니다.
3 0
Programming/Microsoft SQL Server
SQL Server 2008(Express 버전 제외)을 설치하려면 비용을 지불하고 정품을 구입하거나 Microsoft사에서 평가판을 내려 받아야 합니다.

http://msdn.microsoft.com/ko-kr/bb851668.aspx
☞ 평가판 내려받기

위 주소를 통해 들어 가시면 Server 2008 평가판을 DVD나 실행파일 형태로 내려 받으실 수 있는데 DVD 이미지로 내려받으실 경우 CD스페이스나 데몬등을 통해 이미지를 마운트시켜야 설치작업을 시작할 수 있으나 실행파일의 경우 별다른 과정없이 바로 설치작업을 진행할 수 있습니다.

DVD이미지나 실행파일을 내려받은뒤 설치를 시작합니다.


만일 SQL Server 2008을 설치하고자 하는 컴퓨터에 .net Framework(3.5)가 설치되어 있지 않은 경우에는 .net Framework를 설치할지를 묻는 화면이 나타나게 됩니다.
'OK'버튼을 눌러 .net Framework 설치를 시작하도록 합니다.


.net Framework 3.5설치에 관한 License동의를 구하는 화면입니다.
'I have read and ACCEPT the terms of the License Agreemert' 에 체크한 후 Install 버튼을 누릅니다.


.net Framework 3.5설치파일을 인터넷을 통해 내려받은뒤


내려받기가 완료되면 설치를 시작하게 됩니다.

.net Framework 3.5설치가 완료되고 나면 SQL Server 2008의 설치파일을 실행하여 설치를 계속 진행하십시오.


설치초기화면에서 좌측 Installation 항목을 클릭합니다.


이후 우측에 설치와 관련된 항목들이 나오게 되는데 이 항목들 중에서 가장 위쪽에 있는 'New SQL Server stand-alone installation or add features to an existing installation' 항목을 선택하십시오.


SQL Server 2008을 설치하기 위한 시스템환경을 확인하는 화면입니다. 확인이 완료되된후 'OK'버튼을 눌러 다음으로 넘어가면 설치하는 제품버전및 제품키관련 화면이 나타나게 됩니다.

설정된 상태 그대로 두고 'Next'버튼을 누릅니다.


License동의와 관련된 화면입니다. 'I accept the license terms'을 선택하고 'Next'버튼을 누릅니다.


SQL Server 2008설치를 위한 파일설치관련 화면입니다. 'Install'버튼을 눌러 설치를 계속 진행합니다.


설치를 시작하기 전에 여러가지 설정상태를 확인하는 과정입니다. 만일 해당 과정이 모두 끝났음에도 불구하고 'Next'버튼이 활성화 되지 않는다면 현재상태로는 설치가 불가능하다는 것을 의미하므로 문제가 되는 부분을 살펴봐야 합니다.

확인이 완료되면 'Next'버튼을 누릅니다.


설치할 Server구성요소와 설치경로를 지정하는 부분입니다. 설치경로는 되도록이면 기본값 그대로 두고 원하시는 설치항목을 체크한뒤 'Next'버튼을 눌러 줍니다.


SQL Server의 인스턴스를 설정하는 화면입니다.
인스턴스를 지정한다는 것은 소위 이름을 지정한다는 것이며 보통 한대의 컴퓨터라 하더라도 여러버전의 SQL Server가 설치될 수 있습니다. 이때 설치된 이들 서버는 인스턴스에 의해서 각각의 서버가 구분됩니다.

기본값 그대로 두고 'Next'버튼을 누릅니다.


하드디스크 용량을 확인하는 부분입니다.


윈도우 서비스를 실행할 계정을 설정하는 부분입니다.
보통 NETWORK SERVICE나 SYSTEM계정을 설정할 수 있는데 어떠한 계정을 선택하든 큰 지장은 없는듯 합니다만 되도록 NETWORK SERVICE계정을 사용하십시오.

주의:
NETWORK SERVICE계정은 Windows 운영체제 내에서 SYSTEM계정보다 더 낮은 권한을 가지고 있기 때문에 보안상 위험요소를 줄일 수 있는 이점이 있습니다. 하지만 만일 SQL SERVER가 동작하는데 높은 권한이 필요한 상황이 발생하게 되면 문제가 발생할 수 있다는 점을 참고해 두시기 바랍니다.

계정 설정을 위해 'Use the same account for all SQL Server services' 버튼을 누릅니다. AccountName 을 입력하는 부분 옆에 ▼모양을 클릭하면 현재 공통적으로 설정할 수 있는 계정목록이 나오게 됩니다.


해당 계정중에서 NETWORK SERVICE 라는 계정을 선택하고 'OK'버튼을 누르면 모든 서비스에 NETWORK SERVICE라는 동일한 계정이 지정됩니다.


참고:
SQL SERVER 설치시 모든 Service에 대해 동일한 게정을 설정하는 것은 보안상 권장되지 않는 방법입니다.(현재 설치중인 예제에서는 설치의 간편함을 위해 이부분을 무시하고 있습니다.)

'Next'버튼을 눌러 설치를 계속 진행합니다.


SQL Server 관리자 계정에 대한 설정부분입니다.
'Windows authentication mode'로 설정하면 Windows 운영체제에 존재하는 계정으로만 관리자 계정이 설정됩니다.(물론 설치이후 해당 설정을 바꿀 수 있습니다.) 반면 'Mixed Mode (SQL Server authentication and Windows authentication)'으로 설정하면 Windows계정과 sa계정 모두 사용할 수 있게 됩니다.

'Mixed Mode (SQL Server authentication and Windows authentication)'으로 선택후 하단에 sa계정의 암호를 지정할 수 있도록 입력칸이 활성화 되면 sa계정에 대한 적당한 암호를 입력해 주십시오.


sa암호를 설정하고 나면 Windows계정도 관리자 계정에 추가해야 합니다.
'Add Current User'버튼을 클릭하여 Windows 사용자 계정을 추가하도록 합니다.


'Data Directories'는 여러 Database가 설치될 경로를 지정하는 부분입니다. 특별한 경우가 아니면 기본값 그대로 두도록 합니다.


FILESTREAM 은 Windows의 NTFS FileSystem과 SQL Server의 Database를 통합하여 SQL Server에서 binary 데이터등을 저장할때 외부파일형식으로 저장시킴과 동시에 서로간의 일관성을 유지시켜줄 수 있도록 하는 새로운 DataType입니다.


'Enable FILESTREAM for Transact-SQL access'와 'Enable FILESTREAM for file I/O streaming access'항목을 Check하여 FILESTREAM기능을 사용할 수 있도록 합니다.

'Allow remote clients to have streaming access to FILESTREAM data'항목은 원격으상로도 FILESTREAM형식을 통한 access가 가능하게 할것인가를 지정하는 것으로 이 부분은 보안상 권장되지 않을 뿐더러 대부분의 경우 굳이 이 부분을 설정 해야할 필요성도 없으므로 이부분은 check하지 않도록 합니다.

'Next'버튼을 눌러 다음으로 진행합니다.


Analysys Service 를 설치하는 경우 이와 관련된 설정화면 입니다.
별다른 고민없이 'Add Current User'를 클릭한 후 'Next'버튼을 누릅니다.(Data Directories 부분은 분석을 위한 Log파일등등이 어디에 위치할 것이냐를 지정하는 것입니다. 이 부분은 특별한 경우가 아니면 기본값 그대로 사용합니다.)


Reporting Service와 관련된 설정화면입니다.
'Install the native mode default configuration'항목을 선택한 후 'Next'버튼을 누릅니다.
이 항목은 Reporting Service에 대한 기본적은 옵션을 설정하고 사용할 수 있도록 해주며 두번째 설정항목은 SharePoint와의 통합을 위한 것이고 세번째 항목은 Reporting Service에 대한 설정을 별도로 진행할때 설정하는 부분입니다.

'Next'버튼을 눌러 다음으로 진행합니다.


SQL Server설치중 오류가 발생하면 해당 오류에 관한 보고서를 Microsoft사에게 보낼지를 지정하는 부분입니다.
이 부분은 '내가 오류상황을 보낸다고 뭐 달라지는게 있을까?' 하는 마음을 가짐을 가지고 'Next'버튼을 지긋히 눌러줍니다.


설정과 관련된 오류사항을 확인하는 부분입니다.


설정된 내용을 최종적으로 확인하는 부분입니다.


'Install'버튼을 눌러 설치를 진행합니다.


모든 설치가 정상적으로 완료되었습니다.(저사양일 수록 시간이 꽤 오래 걸립니다.)

0 0
Programming/Microsoft SQL Server
Select Distinct B.name
From SYSDEPENDS As A, SYSOBJECTS As B
Where A.id = B.id
And A.DEPID = '[Table ID]'
And B.XTYPE = 'P';

위 Query에서 [Table ID]에 찾고자 하는 Table의 ID를 지정하면 됩니다. 만일 Table의 ID를 모를경우에는 다음과 같이 SYSOBJECTS에서 Table이름으로 ID를 찾을 수 있습니다.

Select * From SYSOBJECTS Where name = '[Table Name]'

위 Query에서 [Table Name]에 ID를 찾고자 하는 Table명을 지정합니다.
0 0
Programming/Microsoft SQL Server

Declare @iPG Char(100);
Set @iPG = 'aaa,bbb,ccc';

Declare @iPos int;
Declare @sTemp char(15);

Declare @Table Table(
 Grp Char(15)
); --문자열을 담을 table

Set @iPos = Charindex(',', @iPG);
--,로 몇개의 문장이 있는가를 확인

While (@iPos > 0)
Begin
 Set @sTemp = Substring(@iPG, 1, @iPos - 1);
--첫번째 문장 구하기

 Insert @Table
 Values(@sTemp);
--위에서 구한 문장 담기

 Set @iPG = Substring(@iPG, @iPos + 1, Datalength(@iPG) - @iPos);
--나머지 문장 구하기
 Set @iPos = Charindex(',', @iPG);
--,로 구분된 문장이 몇개인가를 재 확인
End

If Rtrim(@iPG) <> ''
Begin
 Insert @Table Values (@iPG);
--남아 있는 나머지 문장 담기
End

Select * From @Table;
--최종조회

0 0
Programming/Microsoft SQL Server
1. sp_addmessage

sp_addmessage는 기본적인 Error Message대신 개발자가 직접 Error Message를 작성할 수 있도록 해줍니다.

sp_addmessage 오류번호, 심각도, message내용, 사용언어, 로그여부, 재작성여부
▶<1-1>

<1-1>은 sp_addmessage의 형식을 나타내고 있으며 각 형식에 맞게 들어갈 인수는 다음과 같습니다.

(1) 오류번호
개발자가 직접 Message를 작성하는 경우 오류번호는 50001부터 시작합니다.(50000까지는 기존 Message를 위해 이미 확보된 영역입니다.)

(2) 심각도
1 ~ 25까지 설정합니다.(단, 19 ~ 25까지는 관리자권한의 계정만 설정이 가능합니다.)

(3) Message내용
실제 보여줄 Message를 작성합니다.(Message의 최대크기는 nVarchar(255)까지 입니다.)

(4) 사용언어
Message를 보여줄 언어의 설정부분입니다. 설정이 영어이면 영어, 한국어이면 한국어로 Message를 보여주게 됩니다. 이때 설정된 언어에 따라 다른 언어의 Message를 보여 주어야 하는 경우 같은 오류번호에 여러 언어의 Message를 담을 수도 있습니다.

(5) 로그여부
Message를 출력할때 Windows Application Event Log에 이력을 남겨둘지 지정합니다. 이 인수가 True면 남기고 False이면 남기지 않습니다.

(6) 재작성여부
이미 같은 오류번호, 언어의 Message가 존재할 경우 덮어쓸지 지정하는 부분으로 이 인수를 'Replace'로 지정하는 경우 덮어 쓰게 됩니다.

아래 <1-2>는 sp_addmessage를 통해 Error Message를 추가하는 예제입니다.

Exec sp_addmessage 50001, 16, 'Error', Us_English;
Exec sp_addmessage 50001, 16, '에러', 한국어;
▶<1-2>

<1-2>에서 보여지고 있는 것처럼 sp_addmessage이용해 Message를 추가하는 경우 먼저 Us_English를 통해 영어부터 추가하고 이 후 원하는 언어의 Message를 추가하도록 합니다. 왜냐하면 사용자가 추가한 Message를 보여줄때 현재 언어설정에 상관없이 영어 Message부터 찾고 다시 현재 언어설정에 따른 Message를 찾기 때문입니다.

이제 추가한 Message를 확인해 보도록 하겠습니다.

Select *
From sys.messages
Where message_id in (50001);
▶<1-3>

<1-3>에서 보이는 것처럼 Error Message는 sys.messages system Table에 저장됩니다.

만일 sp_addmessage를 통해 추가한 Message를 삭제하고자 하신다면 sp_dropmessage Procedure를 사용합니다.(되도록이면 sys.messages Table을 직접 조작하지 마십시오.!)

Exec sp_dropmessage 50001, 한국어;
Exec sp_dropmessage 50001, Us_English;

Message의 등록은 영어부터 했지만 삭제는 다른언어의 Message부터 먼저 삭제하고 그 다음 영어 Message를 삭제해야 합니다.

2. Formatmessage

Formatmessage는 기존의 Message를 재가공하여 다른형태(내용)의 Message를 출력할 수 있도록 합니다. 다만 Formatmessage는 sp_addmessage를 통해 추가된 Message만 동작이 가능합니다.

Formatmessage활용을 위해 sp_addmessage로 새로운 Message를 추가해 보도록 하겠습니다.

Exec sp_addmessage 50001, 16, '%s Error', Us_English;
Exec sp_addmessage 50001, 16, '%1! 에러', 한국어;
▶<1-4>

<1-4>에서 보시면 Message내용에 %s 를 붙여 매개변수를 받을 수 있도록 했습니다.(영어에서는 %s이며 한국어는 %1!를 사용합니다.)

이제 Formatmessage를 통해 위에서 추가한 Message를 가공해 보도록 하겠습니다.

Select Formatmessage(50001, 'message =>');
▶<1-5>

<1-5>에서는 Formatmessage를 통해 50001번의 오류번호에 해당하는 Message를 출력하도록 합니다. 단, 'message =>'라는 문자열을 통해 설정된 매개변수에 담아 출력하도록 합니다.(sp_addmessage와는 달리 Formatmessage는 함수이기 때문에 Exec를 붙이지 않습니다.)


만일 한글 Message가 보여지도록 할 경우 언어설정을 한국어로 바꾸도록 합니다.

Set language 한국어;
Select Formatmessage(50001, 'message =>');
▶현재 언어설정을 한국어로 바꾸어 줍니다.


만일 영문 SQL Server나 예제 Database인 AdventureWorks2008을 사용하는 경우 한글이 '??'등의 문자로 나타나는등 제대로 표시되지 않을 수가 있습니다. 이런경우 출력할 내용의 앞부분에 다음과 같이 'N'문자를 붙이면 정상적으로 한글이 표시될 것입니다.

Exec sp_addmessage 50001, 16, N'%1! 에러', 한국어;
Select N'한글입니다.';

주의:
Formatmessage는 매개변수지정 부분에서 다음과 같이 생략이 가능합니다.

Select Formatmessage(50001);

그러나 매개변수를 생략할때 호출되는 Message가 %를 사용해 매개변수를 받도록 설정되어 있다면 해당 부분은 null로 표시됩니다.


3. Raiserror

정해진 형태가 아닌 동적으로 Message를 처리하고자 할때는 Raiserror함수를 사용합니다.(물론 sp_addmessage를 통해 추가된 Message도 처리할 수 있습니다.)

Raiserror함수의 문법은 다음과 같습니다.

① Raiserror(message내용, 오류심각도, 상태, 매개변수);
② Raiserror(message번호, 오류심각도, 상태, 매개변수);

1번은 사용자가 임의로 Message를 출력하고자 할때이며 2번은 sp_addmessage를 통해 추가된 Message를 출력할때 입니다.

아래 예제는 Raiserror를 통해 Message를 반환하는 예제입니다.

Raiserror('Error Code', 16, 1);


Raiserror(50001, 16, 1, 'message =>');

sp_addmessage를 통해 추가된 50001번 Message를 이용하여 출력합니다.


Raiserror를 통해 Message를 직접 작성할 경우 별도의 매개변수를 추가하고자 한다면 다음과 같이 작성합니다.

Declare @Code Char(02);Set @Code = 'ER';Raiserror('Error Code -> %s', 16, 1, @Code);

변수를 사용해 Message를 출력합니다.


만일 Raiserror로 Message출력시 오류심각도를 19이상으로 한다면 Log를 기록하는 With Log가 다음과 같이 추가되어야 합니다.

Raiserror('Database 오류 발생', 19, 1) With Log;

With Log Option이 사용되면 Windows운영체제의 Event Log에 아래 그림처럼 이력이 남게 됩니다.


주의:
Raiserror를 Try Catch문안에서 활용하시고자 한다면 오류심각도 설정에 신중을 기해야 합니다. 오류 심각도는 11~19사이에 지정할 수 있는데 만일 이 범위를 벗어나면 Try Catch문에서 오류를 Catch할 수 없어 Message가 출력되지 않을 수 있습니다.
0 0
1
블로그 이미지

클리엘