/* 일반적인 방법 */
ALTER FUNCTION [dbo].[FN_Split] (
    @str        NVARCHAR(MAX)     -- 원본 문자열
  , @Delimeter  CHAR(1)   = '|'  -- 구분기호(Default '|')
)
RETURNS @SplitedResult TABLE (
    Idx INT IDENTITY(1,1) PRIMARY KEY -- 결과 배열 인덱스
  , Val NVARCHAR(MAX)                 -- 인덱스에 해달하는 결과 문자열
) AS
BEGIN
    -- Declare index
    DECLARE @Idx            INT
    -- Sets the index initialize
    SET @Idx = -1;

    SET @str = ISNULL(@str, '')
    SET @Delimeter = ISNULL(@Delimeter, '|')

    WHILE (LEN(@str) > 0)
    BEGIN
        SET @Idx = CHARINDEX(@Delimeter , @str) ;

        IF (@Idx = 0) AND (LEN(@str) > 0)
        BEGIN
            INSERT INTO @SplitedResult VALUES (RTRIM(LTRIM(@str))) ;
            BREAK ;
        END

        IF (@Idx > 1)
        BEGIN
            INSERT INTO @SplitedResult VALUES (RTRIM(LTRIM(LEFT(@str, @Idx - 1)))) ;
            SET @str = RIGHT(@str, (LEN(@str) - @Idx)) ;
        END
        ELSE
            SET @str = RIGHT(@str, (LEN(@str) - @Idx)) ;
    END

    RETURN
END


/* XML을 이용한 방법 */
IF OBJECT_ID('dbo.Split') IS NOT NULL
    DROP FUNCTION dbo.Split GO
CREATE FUNCTION dbo.Split(@data VARCHAR(MAX), @delimiter VARCHAR(1))
RETURNS TABLE
AS
BEGIN
    DECLARE @textXML XML;
    SELECT    @textXML = CAST('<d>' + REPLACE(@data, @delimiter, '</d><d>') + '</d>' AS XML);

    RETURN (SELECT  T.split.value('.', 'nvarchar(max)') AS data
            FROM    @textXML.nodes('/d') T(split))
END

Some test results:
--------------------------------
Number of Items: 100,000
SplitString Time: 46 ms
Xml2IntList Time: 983 ms
--------------------------------
Number of Items: 10,000
SplitString Time: 40 ms
Xml2IntList Time: 93 ms
--------------------------------
Number of Items: 1,000
SplitString Time: 38 ms
Xml2IntList Time: 15 ms
--------------------------------
Number of Items: 100
SplitString Time: 25 ms
Xml2IntList Time: 1.5 ms
--------------------------------

AND



SELECT
       memoIdx,
       STUFF((
             SELECT ',' + cast(memIdx as varchar(3))
             FROM    MemoReceive b
             WHERE   b.memoIdx = a.memoIdx
             FOR XML PATH('')
        ),1,1,'') AS NAME
FROM MemoReceive a 


FOR XML PATH('') 가 핵심
STUFF는 합쳐진 문자열 맨 앞의 ',' 를 제거하는 역활

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

[SQL] Split 구현하기  (8) 2010.01.27
[SQL] 다중 조건 처리하기  (4) 2009.12.28
MS-SQL 2005에서 페이징 처리  (2) 2008.04.28

AND


DECLARE 
 @value1 varchar(10),
 @value2 varchar(20)

SET @value1 = ''
SET @value2 = 'value'

SELECT * FROM [TABLE] WITH(NOLOCK)
WHERE
     ([COL1] = '' OR [COL1] = @value1)
     AND ([COL2] = '' OR [COL2] = @value2)

위와 같이 사용하면 조건값이 '' 이면 참이 되어 OR 뒤의 조건이 실행되지 않는다.
때문에 [COL1] = @value1의 조건은 무시되고 [COL2] = @value2 조건만 검색하게 된다.

AND


SQL 2005에서는 페이징 방법을 새롭게 적용 있습니다.

또한 쿼리 구문을 복잡하게 사용 하시던 분들은 SQL 2005에서 개발 한다면

아래와 같이 쉽게 사용 하시기 바랍니다.

 

 

DECLARE @CURRPAGE  INT

DECLARE @MAXPAGE   INT

 

SET @CURRPAGE = [ 페이지 주소]

SET @MAXPAGE  = [페이지당 출력 ]

 

 

-- 1. WITH 구문을이용해서하는방법

WITH TEMP_TABLE AS

(

        -- ====================================================================

        SELECT

                       ROW_NUMBER() OVER(ORDER BY [소트할 내용]) AS RowNum,

                       *

               FROM

                       [테이블 ]

        -- ====================================================================

)

SELECT * FROM TEMP_TABLE WHERE ROWNUM BETWEEN ( ( @CURRPAGE - 1 ) * ( @MAXPAGE + 1 ) ) AND ( @CURRPAGE * @MAXPAGE )

 

-- 2. FROM를이용해서하는방법

SELECT

        *

        FROM

               (

                       -- ====================================================================

                       SELECT

                                      ROW_NUMBER() OVER(ORDER BY [소트할 내용]) as RowNum,

                                      *

                              FROM

                                      [테이블 ]

                       -- ====================================================================

               ) AS A

WHERE ROWNUM BETWEEN ( ( @CURRPAGE - 1 ) * @MAXPAGE ) + AND ( @CURRPAGE * @MAXPAGE )

출처 : http://msmvp.egloos.com/3453597

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

[SQL] Split 구현하기  (8) 2010.01.27
[SQL] 여러 로우를 하나의 로우(필드, 컬럼)으로 합치기  (0) 2010.01.25
[SQL] 다중 조건 처리하기  (4) 2009.12.28

AND