2016-03-14 63 views
0

此过程的工作原理直到我尝试传递参数以限制在数据透视表过程的主要选择查询中选择的记录。在SQL数据透视表中传递日期限制结果

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

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

下面是proc下面。

在此先感谢。

ALTER PROCEDURE usp_Get_Monthly_IR_Report

@StartDate SMALLDATETIME ,@EndDate SMALLDATETIME AS

DECLARE @ColumnNames NVARCHAR(MAX)= ''

DECLARE @SQL NVARCHAR(最大值)= ''

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为[优先顺序],IR_Types .IR_Types_Text AS [类型],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_Contract s.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和@EndDate )AS BaseData

PIVOT( 计数(GL_Facilities_Name) FOR GL_Facilities_Name IN(” + @ COLUMNNAMES + ') )AS数据透视表'

EXEC sp_executesql的@SQL

+0

这是否帮助? http://stackoverflow.com/questions/1036745/t-sql-how-to-use-parameters-in-dynamic-sql –

回答

0

因为你想在你的动态查询使用过程参数,则需要在通过他们的动态查询..

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