【问题标题】:Passing date restraints in a SQL Pivot table Result在 SQL 数据透视表结果中传递日期限制
【发布时间】:2016-06-30 03:00:10
【问题描述】:

此过程一直有效,直到我尝试传递参数以限制在数据透视表过程的主选择查询中选择的记录。

如果我注释掉对@Startdate 和@EndDate 的引用,它会起作用,但会选择所有记录。 需要进行哪些更改才能提示日期范围变量并将其合并到查询结果中?

我得到的错误是: 消息 137,第 15 级,状态 2,第 10 行 必须声明标量变量“@StartDate”。

这是下面的过程。

提前致谢。

更改程序 usp_Get_Monthly_IR_Report

@StartDate smalldatetime , @EndDate 小日期时间 作为

DECLARE @ColumnNames NVARCHAR(MAX) = ''

DECLARE @SQL NVARCHAR(Max) = ''

SELECT @ColumnNames += QUOTENAME(GL_Facilities_Name) +',' FROM GL_Facility

SET @ColumnNames = LEFT(@ColumnNames, LEN(@ColumnNames)-1) 设置@sql =

'选择 * 从 ( 选择 IR_Priority_level.IR_Priority_Level_Text 作为 [优先级],IR_Types.IR_Types_Text 作为 [类型],GL_Facilities.GL_Facilities_Name 从 IR_Types 左连接 IR_Priority_Level ON IR_Types.IR_Priority_Level_ID = IR_Priority_Level.IR_Priority_Level_ID 左外连接 IR_Incidents ON IR_Types.IR_Types_ID = IR_Incidents.IR_Types_ID 左加入 GL_Business_Line_Contracts ON IR_Incidents.GL_Business_Line_Contracts_ID = GL_Business_Line_Contracts.GL_Business_Line_Contracts_ID 左加入 GL_Facilities ON GL_Business_Line_Contracts.GL_Facilities_ID = GL_Facilities.GL_Facilities_ID @StartDate 和 @EndDate 之间的 IR_Incidents_Date ) 作为基础数据

枢轴 ( 计数(GL_Facilities_Name) FOR GL_Facilities_Name IN (' +@ColumnNames + ') ) 作为数据透视表'

EXEC sp_executesql @SQL

【问题讨论】:

标签: sql-server parameters pivot


【解决方案1】:

由于您尝试在动态查询中使用过程参数,因此您需要将它们传递给动态查询..

ALTER PROCEDURE usp_Get_Monthly_IR_Report
    @StartDate SMALLDATETIME,
    @EndDate SMALLDATETIME
AS 
BEGIN
    DECLARE @ColumnNames NVARCHAR(MAX) = ''
    DECLARE @SQL NVARCHAR(MAX) = ''

    -- define params that will be used in the dynamic query
    DECLARE @ParmDefinitions NVARCHAR(MAX) = '@StartDate SMALLDATETIME, @EndDate SMALLDATETIME'

    SELECT  @ColumnNames += QUOTENAME(GL_Facilities_Name) + ','
    FROM    GL_Facilities

    SET @ColumnNames = LEFT(@ColumnNames,LEN(@ColumnNames) - 1)
    SET @sql = 'SELECT * FROM ( 
                    SELECT  IR_Priority_level.IR_Priority_Level_Text as [Priority], 
                            IR_Types.IR_Types_Text AS [Type], 
                            GL_Facilities.GL_Facilities_Name 
                    FROM    IR_Types 
                            LEFT JOIN IR_Priority_Level ON IR_Types.IR_Priority_Level_ID = IR_Priority_Level.IR_Priority_Level_ID 
                            LEFT OUTER JOIN IR_Incidents ON IR_Types.IR_Types_ID = IR_Incidents.IR_Types_ID 
                            LEFT JOIN GL_Business_Line_Contracts ON IR_Incidents.GL_Business_Line_Contracts_ID = GL_Business_Line_Contracts.GL_Business_Line_Contracts_ID 
                            LEFT JOIN GL_Facilities ON GL_Business_Line_Contracts.GL_Facilities_ID = GL_Facilities.GL_Facilities_ID 
                    WHERE   IR_Incidents_Date BETWEEN @StartDate and @EndDate 
                ) AS BaseData
                PIVOT ( 
                    Count(GL_Facilities_Name) FOR GL_Facilities_Name IN (' + @ColumnNames + ') 
                ) AS PivotTable'

    EXEC sp_executesql @SQL, @ParmDefinitions, @StartDate = @StartDate, @EndDate = @EndDate
END

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多