【问题标题】:SQL Server: how to insert variables in dynamic SelectSQL Server:如何在动态选择中插入变量
【发布时间】:2014-07-29 09:08:23
【问题描述】:

我有一个存储过程,我想使其动态化,以便它可以处理不同的输入。 除了以下内容外,我已经弄清楚了大部分动态过程。

谁能告诉我如何编写这部分才能在动态过程中使用它? 我只需要在每个变量之前加上'++' 吗?

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

非常感谢,迈克。

【问题讨论】:

  • 动态 SQL 是指将查询放入字符串然后执行。您的查询不在字符串中。
  • 谢谢。这不是整个查询 - 这是一个字符串。我只是不知道如何处理这部分。
  • 我已经添加了整个查询以防万一这样更容易回答。

标签: sql sql-server stored-procedures dynamic dynamic-queries


【解决方案1】:

基本上,您需要在日期常量周围加上单引号。这是一个开始:

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

SQL 足够聪明,能够读取写入在同一系统上的日期。请注意,如果您要更改系统或将其写入文件,则需要明确说明日期格式(使用 convert() 将其置于某种规范格式中)。

【讨论】:

  • 修复了它 - 似乎我只是错过了两个引号。非常感谢您的快速帮助和解释!
猜你喜欢
  • 1970-01-01
  • 2014-10-26
  • 2014-10-05
  • 2012-02-21
  • 1970-01-01
  • 2016-05-16
  • 1970-01-01
  • 2015-10-27
  • 1970-01-01
相关资源
最近更新 更多