2014-06-08 51 views
0

我有一個存儲過程,我想使其動態變化,以便它可以處理不同的輸入。 除了以下幾點外,我得到了大部分的動態過程。SQL Server:如何在動態中插入變量選擇

有人能告訴我如何寫這部分以便在動態過程中使用它嗎? 我只需要在每個變量之後放'+之前和+'

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 

非常感謝邁克。

+1

動態SQL是指將查詢放入字符串中,然後執行它們。您的查詢不在字符串中。 –

+0

謝謝。這不是整個查詢 - 這是一個字符串。我只是不知道如何處理這部分。 – Mike

+0

我已經添加了整個查詢,以防止它更容易回答。 – Mike

回答

1

基本上,你需要單引號圍繞日期常量。下面是一個開始:

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

SQL足夠聰明,能夠讀取寫在同一個系統上的日期。請注意,如果您正在更改系統或將其寫入文件中,則需要明確說明日期格式(使用convert()將其置於某種規範格式)。

+0

修正了它 - 似乎我錯過了兩個引號。非常感謝您的快速幫助和解釋! – Mike