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