2014-06-08 1 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 

Edit: Весь запрос в FYI. Прежде чем я сделал эту динамику, она работала правильно, поэтому я предполагаю, что у меня есть некоторые недостающие или ненужные цитаты здесь или любая другая ошибка записи. Кроме того, я не уверен, что условия 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

 Смежные вопросы

  • Нет связанных вопросов^_^