[MSSQL] 문자열 계산식에서의 null의 취급

MS SQL | 2011. 2. 11. 19:32
Posted by Haronoid
SQL 서버에서는 문자열 컬럼을 계산식에서 사용할 떄 값이 null을 갖을 경우 결과는 null을 돌려주게 된다.
ORACLE에서는 null은 공백문자와 같은 취급이기 때문에 null은 그냥 공백문자 취급이 되지만 MS SQL Server에서는 다른 결과를 돌려주기 때문에 주의해야 한다.

 MS SQL 서버에서 실행
  SQL1 : select 'a' + null + 'b'
  SQL2 : select 'a' + '' + 'b'

> 결과
  SQL1 <- null
  SQL2 <- 'ab'
  • 문자열 계산식에서 값에 null이 있기 때문에 결과는 null이 된다.
ORACLE에서의 예
  SQL1 : select 'a' + null + 'b' from dual;
  SQL2 : select 'a' + '' + 'b' from dual;

> 결과
  SQL1 <- 'ab'
  SQL2 <- 'ab'
  • ORACLE에서는 null의 문자열계산은 null을''로 치환한 결과가 된다.
 
SQL서버에서도 SELECT문의 결과를 새로운 테이블을 작성해 데이터를 넣을 수 있다.
정확히는 없으면 많들어 넣고, 있으면 그냥 투입하기 떄문에 오라클의 그것보다 강력한 기능이긴 하다.
ORACLE에서는CREATE TABLE NEW_TBL1 AS SELECT * FROM TBL2의 방식이 되는데, SQL 서버에서는 이하의 방법으로 사용하게 된다.
SELECT * INTO NEW_TBL1 FROM TBL2;
  • 결과 TBL2의 전 항목이 NEW_TBL1에 새로 투입되게 된다.
    PK,Index나Triger등은 작성되지 않지만, 각 컬럼의 속성들은 그대로 작성된다.
    컬럼의 속성,Identity,NULL등의 속성은 그대로 계승

 

[MSSQL]SQL Server의Minus、Except

MS SQL | 2011. 2. 11. 19:18
Posted by Haronoid
1. Oracle의MINUS연산자가 SQL Server에는 존재하지 않는다.
대신이라고 하긴 조금 틀리지만EXCEPT라는 연산자가 있어, 약간은 비슷한 처리를 할 수 있다.
EXCEPT : 왼쪽의 쿼리에 있고, 오른쪽 쿼리에 없는 각 값을 돌려준다.
insert into TBL1 values ('1');
insert into TBL1 values ('2');
insert into TBL1 values ('3');
insert into TBL2 values ('1');
insert into TBL2 values ('3');

select * from TBL1
EXCEPT
select * from TBL2

>결과
2
  • 위의 예로는 MINUS와 같은 결과가 된다.
2. 왼쪽 쿼리의 결과에 오른쪽 쿼리가 복수의 일치하는 값을 갖고 있을경우엔 MINUS와는 다른 결과가 되고 만다.
일치하는 모든 값을 제거해 버리기 때문이다.
insert into TBL1 values ('1');
insert into TBL1 values ('1');
insert into TBL1 values ('2');
insert into TBL2 values ('1');
insert into TBL2 values ('3');

select * from TBL1
EXCEPT
select * from TBL2

>결과
2
  • TBL1에 복수 존재하는 "1"의 값은 모두 제거된 뒤의 결과가 된다.
 
1. Visual Studio의devenv.exe를 사용하는 방법
화일의 위치 : C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\
실행화일명 : devenv.exe

실행예
devenv.exe {%Solution화일명%} /rebuild
devenv.exe {%Solution화일명%} /out compile.log /rebuild
devenv.exe {%Project화일명%} /rebuild
  • rebuild 옵션만으로는 실행결과가 표시되지 않기에 성공/실패 여부는 알수 없다.
  • out 옵션으로 로그화일을 지정해주면 실행결과를 확인 하기 쉽다.
  • 다른 옵션은 필요에 따라서 /?로 확인이 가능
2. Compiler를 사용하는 방법(csc.exe,vbc.exe등)
csc {%Solution화일명%}
  • C#의 경우엔 csc.exe, VB.NET의 경우엔 vbc.exe을 사용하게 된다.
3. .NET의MSBuild.exe를 사용하는 방법
화일의 위치 : C:\Windows\Microsoft.NET\Framework\v3.5\
실행화일명 : MSBuild.exe

실행예
MSBuild.exe {%Solution화일명%} /p:Configuration=Release >> bulid.log

 
MS SQL Server에서 동적으로 SQL을 짜고, 실행하고, 값을 돌려받을 수 있다.
이하의 소스가 그 예로, 동적SQL 속의 변수(@sDate1,@sDate2)에 할당된 값을 외부의  변수(@sOutput1,@sOutput2)에 할당하고 있다.
declare @sSQL      nvarchar(max);
declare @sParam    nvarchar(max);
declare @sOutput1  char(8);
declare @sOutput2  char(10);

set @sSQL = N'select @sDate1 = convert(char(8),getdate(),112)'
set @sSQL = @sSQL + N',@sDate2 = convert(char(10),getdate(),111)'

set @sParam = N'@sDate1 char(8) OUTPUT';
set @sParam = @sParam + N',@sDate2 char(10) OUTPUT';

execute sp_executesql @sSQL, @sParam
                    , @sDate1 = @sOutput1 OUTPUT
                    , @sDate2 = @sOutput2 OUTPUT

select @sOutput1, @sOutput2

→실행결과
20110210 2011/02/10


예에서는 1행의 값을 돌려주기에 문제없지만, 북수행의 결과를 돌려줄 경우엔 최종행의 값이 얻어지게 된다.
 오라클에서는 에러가 나지만, MS SQL Server에서는 에러는 일어나지 않는다.
 

[C#]확장메소드의 사용방법

.NET | 2011. 1. 9. 01:14
Posted by Haronoid
C# 3.0부터 추가된 기능으로 확장메소드라는 기능이 있다. 일시적으로 대상클래스에 추가메소드를 정의해 사용하는 방법인데, 잘 쓰면 하나의 기능추가를 위해 기존 기능을 상속받아 구현할 필요까지는 없게해주는 편리한 도구라고 할 수 있다.
파라메터에 this를 넘겨주면 자동적으로 대상 클래스의 뒤에 확장 메소드를 사용할 수 있다.

아래는 GcDate라는 클래스로부터 얻는 문자열을 가공해서 에러의 위험을 피하기위한 샘플 코드이다.
//클래스명은 아무거나 상관없지만 되도록이면 알기쉬운 클래스명이면 좋을 것이다.
public static class GcDateUtil
{
    //추가할 확장메소드(GcDate형 변수에서 사용할 수 있다.)
    public static string GetText(this GcDate dtmDate)
    {
        string rtnText = dtmDate.Text;

        rtnText = rtnText.Replace("/", "").Replace("_", "");

        if (rtnText.Length == 0)
        {
            return dtmDate.Text;
        }
        else
        {
            return dtmDate.Value.GetValueOrDefault().ToString("yyyy/MM/dd");
        }
    }
}

사용예
GcDate dtmA = new GcDate();
 GcDate dtmB = new GcDate();

 dtmA.Value = DateTime.now();
 dtmA.Text = "";

 string strA = dtmA.GetText();
 string strB = dtmB.GetText();

結果
 strA <- "2011/01/07"
 strB <- "____/__/__"

 +GcDate클래스는 GraphCity사의 클래스로 날자 디폴트는 "____/__/__"를 텍스트로 보존하고 있다.
 

[.NET] struct를 이용한 환경설정을 보존하는 샘플

.NET | 2010. 12. 25. 00:29
Posted by Haronoid
*Serializable을 지정한 struct를 XML형식으로 내보내는 예
[Serializable]
public struct GrobalSettings
{ // .. //}

GrobalSettings mySets;
XmlSerializer ser = new XmlSerializer(typeof(GrobalSettings));
TextWriter wr = new StreamWriter("data.xml");
ser.Serialize(wr.mySets);
wr.Close();

이것런 방식으로 Serializable가능한 구조체를 Xml형식으로 저장하고 관리하는 것이 가능하다.
저장 폴더는 어플리케이션의 정보를 어떤단위로 저장할 것인가에 따라 각각의 폴더에 저장하면 된다.
폴더 위치는 이전 포스팅에서 참조
 

[.NET] enum을 리스토로서 반복시키는 방법

.NET | 2010. 12. 25. 00:13
Posted by Haronoid
*Enum클라스를 이용해 enum으로 설정한 명칭과 값을 순서대로 가져오기위한 방법이다.
 -테이블의 컬럼명등을 enum으로 지정하면 편한데, insert문을 만들때도 enum을 반복시켜서 만들면, 일일이 쓰는 수고와 유지비용을 절감할 수 있다.
enum eCLMS
{
Top = 0
,
Middle
,
Bottom
}

foreach (eCLMS enumItem in Enum.GetValues(typeof(eCLMS)))
{
    Console.Write(Enum.Parse(typeof(eCLMS), enumItem.ToString()).ToString() + " <-");
    Console.WriteLine((int)enumItem.toString());
}

*실행결과
Top <-0
Middle <-1
Bottom <-2

활용하기에 따라 방법은 여러가지로 있을 듯하다.
 

[.NET] 시스템의 폴더정보를 얻는 방법

.NET | 2010. 12. 25. 00:08
Posted by Haronoid
*System.Windows.Forms.Application를 이용하는방법
CommonAppDataPath = C:\Documents and Settings\All Users\Application Data\{Company name}\{Program name}\{Version}
UserAppDataPath = C:\Documents and Settings\{UserName}\Application Data\{Company name}\{Program name}\{Version}
LocalUserAppDataPath = C:\Documents and Settings\{UserName}\Local Settings\Application Data\{Company name}\{Program name}\{Version}

StartupPath = {실행화일의 위치 폴더}
ExecutablePath = {실행화일의 위치 폴더+실행파일명}

*System.Environment을 이용하는 방법
CommandLine = "{실행화일의 위치 폴더+실행파일명}" 
CurrentDirectory = {실행화일의 위치 폴더}

GetFolderPath(Environment.SpecialFolder.ApplicationData)
->C:\Documents and Settings\{UserName}\Application Data

+SpecialFolder로 얻을 수 있는 폴더 리스트
Desktop <-C:\Documents and Settings\{UserName}\Desktop
Programs <-C:\Documents and Settings\{UserName}\StartMenu\Program
Personal <-C:\Documents and Settings\{UserName}\My Documents
Personal <-C:\Documents and Settings\{UserName}\My Documents
Favorites <-C:\Documents and Settings\{UserName}\Favorites
Startup <-C:\Documents and Settings\{UserName}\StartMenu\Program\StartUp
Recent <-C:\Documents and Settings\{UserName}\Recent
SendTo <-C:\Documents and Settings\{UserName}\SendTo
StartMenu <-C:\Documents and Settings\{UserName}\StartMenu
MyMusic <-C:\Documents and Settings\{UserName}\My Documents\My Music
DesktopDirectory <-C:\Documents and Settings\{UserName}\Desktop
MyComputer <-
Templates <-C:\Documents and Settings\{UserName}\Templates
ApplicationData <-C:\Documents and Settings\{UserName}\Application Data
LocalApplicationData <-C:\Documents and Settings\{UserName}\Local Settings\Application Data
InternetCache <-C:\Documents and Settings\{UserName}\Local Settings\Temporary Internet Files
Cookies <-C:\Documents and Settings\{UserName}\Cookies
History <-C:\Documents and Settings\{UserName}\Local Settings\History
CommonApplicationData <-C:\Documents and Settings\All Users\Application Data
System <-C:\WINDOWS\system32
ProgramFiles <-C:\Program Files
MyPictures <-C:\Documents and Settings\{UserName}\My Documents\My Pictures
CommonProgramFiles <-C:\Program Files\Common Files


 

[MSSQL] SQL Server 2008에서 MERGE문 사용

MS SQL | 2010. 12. 23. 15:49
Posted by Haronoid
* MS SQL Server 2008부터 서포트하게된 MERGE문의 사용방법
MERGE TBL1
USING TBL2
ON (TBL1.CLM1 = TBL2.CLM1)
WHEN MATCHED THEN
UPDATE SET TBL1.CLM2 = TBL2.CLM2
WHEN NOT MATCHED THEN
INSERT (TBL1.CLM1, TBL1.CLM2) Values (TBL2.CLM1, TBL2.CLM2);
c
  • TBL1의CLM1에TBL2의CLM1가 있을 경우 CLM2을 갱신
  • TBL1의CLM1에TBL2의CLM1가 없을 경우 TBL1에 새레코드를 등록

**비교대상이 테이블이 아닌경우의 사용예
일반적으로는 이 예의 경우가 자주 쓰기게 될 것같다.
MERGE TBL1
USING (SELECT 'A' CLM1, 'B' CLM2) TBL2
ON (TBL1.CLM1 = TBL2.CLM1)
WHEN MATCHED THEN
UPDATE SET TBL1.CLM2 = TBL2.CLM2
WHEN NOT MATCHED THEN
INSERT (TBL1.CLM1, TBL1.CLM2) Values (TBL2.CLM1, TBL2.CLM2);
  • TBL1의CLM1에'A'가 있을 경우 갱신
  • 없을 경우엔 새레코드로 등록한다.
 
블로그 이미지

Haronoid

기본적으로 프로그래밍 관련 메모를 중점으로 합니다. 자세한 설명이 결여되어 있을 가능성이 있습니다.

카테고리

분류 전체보기 (29)
프로그래밍 기본 (1)
VB&VBA (1)
JAVA (0)
ORACLE (10)
WidnowsCommandLine (2)
Excel (1)
Windows (1)
.NET (6)
MS SQL (6)