mssql split 함수 DB/MS-SQL 2012/01/27 18:02
CREATE FUNCTION [dbo].[arr_split](
 @sText  VARCHAR(max),  -- 대상 문자열
 @str   CHAR(1) = '|',       -- 구분기호(Default '|')
 @idx  INT                       -- 배열 인덱스

)
RETURNS VARCHAR(max)
AS
BEGIN
 DECLARE @word    varchar(max),    -- 반환할 문자
      @sTextData  VARCHAR(600), 
      @num    SMALLINT;
     
 SET @num = 1;
 SET @str = LTRIM(RTRIM(@str));
 SET @sTextData = LTRIM(RTRIM(@sText)) + @str; 
 
 WHILE @idx >= @num
 BEGIN

  IF CHARINDEX(@str, @sTextData) > 0
  BEGIN
   -- 문자열의 인덱스 위치의 요소를 반환
   SET @word = SUBSTRING(@sTextData, 1, CHARINDEX(@str, @sTextData) - 1);
   SET @word = LTRIM(RTRIM(@word));

   -- 반환된 문자는 버린후 좌우공백 제거   
   SET @sTextData = LTRIM(RTRIM(RIGHT(@sTextData, LEN(@sTextData) - (LEN(@word) + 1))))
  END ELSE BEGIN
   SET @word = NULL;
  END
  SET @num = @num + 1
 END
 RETURN(@word);
END

위의 것을 붙여 넣기만 하시면 바로 함수로 사용 가능합니다.

그외의 팁으로 함수만들기가 귀찮으신 분들은...

substring(@File5, 0, charindex('//',@STR)) //이것은 나눈 첫번째
 
ISNULL(substring(@STR,len(@STR)-arindex('//',reverse(rtrim(@STR)))+2,len(@STR)),0) //나눈 두번째 

이런식으로 사용이 가능합니다. 






 
UPDATE ~ SELECT 문 DB/MS-SQL 2012/01/16 17:57

date distribute 
   set right_pv = b
 where userid in (select userid from b)

 

update distribute_cp_temp
   set (parents_id, recomm_id) = (select SPONSORID, INTRODUCORID
                    from dist2 
     where DISTRIBUTORID = distribute_cp_temp.userid);

 

update ddd
   set cyberpoint = (select cybermoney
                         from d
                 where DISTRIBUTORID = ddd.userid);

 

update distribute_cp_temp
   set (parents_name) = (select name
                    from d 
     where DISTRIBUTORID = distribute_cp_temp.userid
       and url is not null);

 
 

update 상품 a
set a.판매개시일 =
                 (select b.판매개시일
                    from tmp_상품판매개시일 b
                   where a.상품코드= b.상품코드
                   )
where a.상품코드 in(select 상품코드 from tmp_상품판매개시일)

 

UPDATE 부점 A
  SET A.영문부점명 = (SELECT 영문부점명
                    FROM 영문부점명 B
                  WHERE A.부점 = B.부점 
                  )
  WHERE EXISTS (SELECT 영문부점명
                    FROM 영문부점명 B
                  WHERE A.부점 = B.부점                      
                )

다음 코드는 하나 이상의 특정 테이블에 관련된 모든 저장 프로 시저 (SP)를 찾는 문 입니다. sp_help 및 sp_depends는 항상 정확한 결과를 반환 하지 않더라구요. 2005 2008테스트 해보았습니다.

----Option 1 
SELECT DISTINCT so.name 
FROM syscomments sc 
INNER JOIN sysobjects so ON sc.id = so.id 
WHERE sc. TEXT LIKE '%tablename%' 
----Option 2 
SELECT DISTINCT o.name , o.xtype 
FROM syscomments c 
INNER JOIN sysobjects o ON c.id = o.id 
WHERE c. TEXT LIKE '%tablename%

기본적으로 SQLGATE 를 사용하신다면 TIMESTAMP 를 사용시 업데이트 시에도 자동으로 TIMESTAMP 를 지정한 컬럼은 해당 등록 날짜도 함께 업데이트 된다 . 

문제는 간단하다..DEFAULT설정이  문제인것이다..

TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP



이런 식으로 들어가 있을 것이다.

이렇게 된다면 기본적으로 인서트, 업데이트시에도 날짜가 업데이트 된다
ON UPDATE CURRENT_TIMESTAMP 이 구문에 의해서 업데이트가 된다.

만들때 DEFAULT 를 해서   CURRENT_TIMESTAMP 만든다면 좋지만 만약 이미 데이터가 있고

컬럼의 default 값만을 수정하고 싶다면

alter table 테이블명 MODIFy 컬럼명

timestamp default current_timestamp not null;


이런식으로 컬럼의 default 값을 바꾸어 주면 된다. 

'DB > MY-SQL' 카테고리의 다른 글

MYSQL TIMESTAMP 속성.  (0) 2011/08/09

우선 cmd 명령을 실행하기 위해 mssql 2005 버젼 이상 에서 사용가능한 xp_cmdshell  을 확장 해야 한다. 확장 명령어는 아래와 같다.

 
EXEC sp_configure 'show advanced options', 1
GO
-- To update the currently configured value for advanced options.
RECONFIGURE
GO
-- To enable the feature.
EXEC sp_configure 'xp_cmdshell', 1
GO
-- To update the currently configured value for this feature.
RECONFIGURE
GO

이제 쿼리문에서 실행문은 아래와 같다.

EXEC master..xp_cmdshell '경로\파일명';

끝~ 그럼 즐프 하세요~ 


아 참고로 다시 xp_cmdshell 명령을 막으시려면

use master
go
exec sp_dropextendedproc 'xp_cmdshell';

이렇게 하심 됩니다~

 

MS SQL 2005는 기존의 2000과는 다른게 설치 후 기본으로 외부에서 접근하는걸 막아놓은거 같다. 해서 DB를 설치 후 메뉴에서 'Microsoft SQL Server 2005' -> '구성도구' -> 'SQL Server 노출 영역 구성' 를 실행한 후 '서비스 및 연결에 대한 노출 영역 구성' 을 실행한다.

이 후 나온 다이얼로그에서 붉은 박스 부분을 선택하여 적용을 시킨 후 종료한다.

자 이걸로 SQL의 외부접속옵션은 변경되었다. 이제 Windows의 방화벽을 열어야한다. 이제 제어판의 'Windows 방화벽'을 실행하여 방화벽을 사용 안 함으로 하기엔 좀 꺼림직하므로 예외에 sqlserver.exe를 추가하여 SQL실행파일만 방화벽을 열어 놓는게 좋을 듯하다.
MS SQL 2005를 C에 설치하였다면 위치는
C:\Program Files\Microsoft SQL Server\MSSQL.2\MSSQLBinn\sqlservr.exe 이다.

이제 다시는 이 문제로 시간을 낭비하는 일이 없도록.....

CREATE TABLE #ta
(
nick varchar(50)
)
insert into #ta(nick)select n_nick from 테이블명
insert into #ta(nick)select petNick from 테이블명
select * from #ta where nick=@nick
drop Table #ta


가상의 테이블에 2개의 닉네임을 넣는다..

취지는 해당닉네임의 중복을 막기 위함니다. 2개의 테이블 모두 다른 닉네임을 

사용하기 위해 쓰고있다^^
 CREATE FUNCTION FN_SPLIT
(
    @StrValue VARCHAR(1000), 
    @SplitChar VARCHAR(1)         
RETURNS @SPLIT_TEMP TABLE  ( VALUE VARCHAR(50) )
AS 
BEGIN   
    DECLARE @oPos INT, @nPos INT
    DECLARE @TmpVar VARCHAR(1000) 

 

    SET @oPos = 1 
    SET @nPos = 1 

 

    WHILE (@nPos > 0)
    BEGIN

        SET @nPos = CHARINDEX(@SplitChar, @StrValue, @oPos )


        IF @nPos = 0 
            SET @TmpVar = RIGHT(@StrValue, LEN(@StrValue)-@oPos+1 )
        ELSE
            SET @TmpVar = SUBSTRING(@StrValue, @oPos, @nPos-@oPos)

 

        IF LEN(@TmpVar)>0
            INSERT INTO @SPLIT_TEMP VALUES( @TmpVar )


        SET @oPos = @nPos +1 
    END


   RETURN 
END
mssql join문 DB/MS-SQL 2010/07/15 16:04
예제) 
select tt.*, cr.curriculumType as curiitype, lc.theme as theme,
cr.theme as name, cr.sid as sids
 from tbl_timetable tt 
 inner join tbl_regcurriculum rc on rc.userNo=tt.userNo 
 inner join tbl_Curriculum cr on cr.sid = rc.curriNo
 inner join tbl_lecture lc on lc.sid = tt.
lectureNo 
lectureNo 
 where tt.teacherNo= '@teacherNo'*/


쉽게 join문을 설명 하면 

1. INNER JOIN


SELECT at.name, tr.title

FROM music ms

INNER JOIN artist at ON ms.aid = at.aid

INNER JOIN track tr ON ms.kid = tr.kid

ORDER BY ms.num DESC


위와 같이 쿼리를 날리면 music과 artist 중에서 aid 필들의 값이 같은것..


music과 track 중에서 kid 필들의 값이 같은것 들이 출력된다.


즉, INNER JOIN은 두개의 테이블에 공통된 값만 출력이 된다.




2. LEFT OUTER JOIN


SELECT at.name, tr.title

FROM music ms


LEFT OUTER JOIN artist at ON ms.aid=at.aid 

LEFT OUTER JOIN track tr on ms.kid=tr.kid 

ORDER BY ms.num DESC


위와 같이 쿼리를 날리면 INNER JOIN과는 다르게 공통된 값 외에도 공통되지 않은 값이


Null 값으로 출력이된다. 즉, 전체가 출력이 된다.




3. SELECT 안에 SELECT


SELECT num, title, 

(SELECT name FROM artist WHERE music.aid=artist.aid) AS name,

(SELECT mttl FROM title


WHERE tid=(SELECT tid from track WHERE kid=music.kid))AS mttl

FROM music

ORDER BY num DESC


SELECT 안에 SELECT를 넣음으로써 다른 테이블에서 필요한 필드만 가져 올 수가 있다.


참고로 다중 select 방식은 너무..ㅡㅡ 지저분 하죠''; ㅋㅋ 

While charindex('|', @filename) <> 0 OR Len(rtrim(@filename)) > 0
begin
 If (charindex('|', @filename) = 0)
 Begin
set @TName = @filename
set @filename = ''
 End
 Else
 Begin
select @TName = SubString(@filename, 0, charindex('|', @filename))
Set @filename = SubString(@filename, CharIndex('|', @filename) + 1, len(@filename))
 End
  print(@TName)
end

ㄱl본적으로 mssql은 오라클처럼 배열이 없다.ㅠㅠ 흑흑..아쉽다..

그래서 짜보았다.. 배열처럼 인서트를 한다!! ㅋㅋ 자르기 문자열을 넣어주면.. 사용가능.. ^^ 그럼 숙오요!

참고로 여기서 자르기 문자열은 '|' 이거였어요~^^ 

'DB > MS-SQL' 카테고리의 다른 글

mssql 문자열 자르기 함수 형식  (0) 2010/10/04
mssql join문  (0) 2010/07/15
mssql 배열 사용하기  (0) 2010/06/18
mssql autoincrease 값 가져오기  (0) 2010/06/04
MSSQL 데이터 타입 크기 범위  (0) 2010/05/31
mssql convert()  (0) 2010/05/29