2014-06-08 3 views
0

다양한 입력을 처리 할 수 ​​있도록 동적으로 만들려는 저장 프로 시저가 있습니다. 다음을 제외한 대부분의 동적 절차를 알아 냈습니다.SQL Server : 동적으로 변수를 삽입하는 방법 Select

동적 절차에서이 부품을 사용하려면 어떻게 작성해야합니까? 각 변수 다음에 '+을 앞에두고 +'을 넣어야합니까?

INSERT INTO @temp 
(
      dateRange 
) 
SELECT  @date0 
UNION ALL 
SELECT  @date1 
UNION ALL 
SELECT  @date2 
UNION ALL 
SELECT  @date3 
UNION ALL 
SELECT  @date4 
UNION ALL 
SELECT  @date5 

편집 : 전체 쿼리와 참고하시기 바랍니다. 이 동적 인 작업을하기 전에 올바르게 작동하고 있으므로 여기에 누락되거나 불필요한 따옴표가 있거나 다른 글쓰기 실수가 있습니다. 또한 마지막 중첩 쿼리의 Where 조건이 동적으로 작성된 것인지 확실하지 않습니다.

ALTER PROCEDURE [dbo].[FetchHistoryCombined] 
    @selection nvarchar(100), 
    @date0 nvarchar(20), 
    @date1 nvarchar(20), 
    @date2 nvarchar(20), 
    @date3 nvarchar(20), 
    @date4 nvarchar(20), 
    @date5 nvarchar(20) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    BEGIN 

    DECLARE @sql nvarchar(max) 

    SET @sql = N' DECLARE @temp AS TABLE 
    (
       dateRange nvarchar(20) 
    ) 
    DECLARE @temp2 AS TABLE 
    (
       ranking int, 
       item nvarchar(100), 
       volume int 
    ) 

    INSERT INTO @temp 
    (
       dateRange 
    ) 
    SELECT  ' + @date0 + ' 
    UNION ALL 
    SELECT  ' + @date1 + ' 
    UNION ALL 
    SELECT  ' + @date2 + ' 
    UNION ALL 
    SELECT  ' + @date3 + ' 
    UNION ALL 
    SELECT  ' + @date4 + ' 
    UNION ALL 
    SELECT  ' + @date5 + ' 

    INSERT INTO @temp2 
    (  
       ranking, 
       item, 
       volume 
    ) 
    SELECT  Top 10 RANK() OVER(ORDER BY COUNT(*) desc, ' + @selection + ') [Rank], 
       ' + @selection + ', 
       COUNT(*) AS volume 
    FROM  LogEsc 
    WHERE  dateEsc LIKE ''' + @date0 + '%'' 
    AND   EID LIKE ''PE%'' 
    GROUP BY ' + @selection + ' 
    ORDER BY volume desc, ' + @selection + ' 

    SELECT  
       (
         SELECT  A.item 
         FROM  @temp2 A 
         ORDER BY A.ranking, A.item 
         FOR XML PATH(''''), ELEMENTS, TYPE 
       ) AS top10, 
       (  
         SELECT  B.dateRange, 
            (
              SELECT  C.item, 
                 (
                   SELECT  COUNT(*) AS volume 
                   FROM  LogEsc D 
                   WHERE  D.' + @selection + ' = C.item 
                   AND   D.EID LIKE ''PE%'' 
                   AND   D.dateEsc LIKE B.dateRange + ''%'' 
                   FOR XML PATH(''''), ELEMENTS, TYPE 
                 ) 
              FROM  @temp2 C 
              ORDER BY C.ranking, C.item 
              FOR XML PATH(''''), ELEMENTS, TYPE 
            ) AS [dateRange/items] 
         FROM @temp B 
         FOR XML PATH(''''), ELEMENTS, TYPE 
       ) AS history 
    FOR XML PATH(''ranking''), ELEMENTS, TYPE, ROOT(''ranks'')' 

    EXEC(@sql) 

    END 
END 

미리 감사드립니다. Mike.

+1

동적 SQL은 쿼리를 문자열에 넣은 다음 실행하는 것을 말합니다. 검색어가 문자열에 없습니다. –

+0

감사합니다. 이것은 전체 쿼리가 아니라 문자열에있는 것입니다. 나는이 부분을 어떻게 처리해야할지 모른다. – Mike

+0

대답하기가 쉽기 때문에 전체 쿼리를 추가했습니다. – Mike

답변

1

기본적으로 날짜 상수는 작은 따옴표로 묶어야합니다. 여기에 시작 :

INSERT INTO @temp(dateRange) 
SELECT  ''' + @date0 + ''' 
UNION ALL 
SELECT  ''' + @date1 + ''' 
UNION ALL 
. . . 

SQL은 똑같은 시스템에서 작성된 날짜를 읽을 수있을만큼 똑똑합니다. 시스템을 변경하거나 파일로 작성하는 경우 날짜 형식에 대해 명시해야합니다 (convert()을 사용하여 표준 형식으로 지정해야 함).

+0

그걸 수정했는데, 방금 두 개의 따옴표를 놓친 것 같습니다. 빠른 도움과 설명을 해주셔서 감사합니다! – Mike