Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何管理不同条件下的查询?_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 如何管理不同条件下的查询?

Sql 如何管理不同条件下的查询?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在工作并试图根据这些条件管理我的查询 所有站点,所有状态 所有站点,具体状态 特定站点,所有状态 特定站点、特定状态 注意:在我的存储过程中,0表示所有,所有站=0,所有状态=0 存储过程: ALTER PROCEDURE [dbo].[SelectFineIssuanceAll_Sp] @StatusID smallint, @StationID smallint, @FromDate smalldatetime, @ToDate smalldatetime AS BEGI

我正在工作并试图根据这些条件管理我的查询

  • 所有站点,所有状态
  • 所有站点,具体状态
  • 特定站点,所有状态
  • 特定站点、特定状态
  • 注意:在我的存储过程中,
    0
    表示所有,所有站=0,所有状态=0

    存储过程:

    ALTER PROCEDURE [dbo].[SelectFineIssuanceAll_Sp]
      @StatusID smallint,
      @StationID smallint,
      @FromDate smalldatetime,
      @ToDate smalldatetime
    AS
    BEGIN
        Begin Try
           If(@StatusID = 0) --if all statuses
           Begin 
               If(@StationID = 0)    --if all stations and statuses
                   Begin
                       Select 
                            dbo.Web_Users.Name as UserName, Issuance.Vehicles.VehicleID,
                            dbo.VehicleTypes.VehicleType, Issuance.LTOperator.LTName,
                            dbo.Stations.StationName, dbo.Statuses.Status 
                       from 
                            Issuance.FineIssuance
                       Inner Join 
                            dbo.Web_Users ON Issuance.FineIssuance.User_ID = dbo.Web_Users.UserID
                       Inner Join 
                            dbo.Statuses ON dbo.Statuses.StatusID = Issuance.FineIssuance.Status_ID
                       Inner Join 
                            Issuance.Vehicles ON Issuance.Vehicles.VehicleID = Issuance.FineIssuance.Vehicle_ID
                       Inner Join 
                            VehicleTypes ON dbo.VehicleTypes.VehicleTypeID = Issuance.FineIssuance.VehicleType_ID
                       Inner Join 
                            Issuance.LTOperator ON Issuance.LTOperator.LTID = Issuance.FineIssuance.LTOperator_ID
                       Inner Join 
                            dbo.Stations ON dbo.Stations.StationID = Issuance.FineIssuance.Station_ID
                       Where 
                            Issuance.FineIssuance.IssuanceDateTime >=  CONVERT(smalldatetime, @FromDate)
                            AND Issuance.FineIssuance.IssuanceDateTime <= CONVERT(smalldatetime, @ToDate)
    
                   End  -- if all stations and statuses
               Else
                   Begin -- else all statuses and specific station
    
                       Select dbo.Web_Users.Name as UserName, Issuance.Vehicles.VehicleID,
                       dbo.VehicleTypes.VehicleType, Issuance.LTOperator.LTName,
                       dbo.Stations.StationName, dbo.Statuses.Status from Issuance.FineIssuance
                       Inner Join dbo.Web_Users
                       ON Issuance.FineIssuance.User_ID = dbo.Web_Users.UserID
                       Inner Join dbo.Statuses
                       ON dbo.Statuses.StatusID = Issuance.FineIssuance.Status_ID
                       Inner Join Issuance.Vehicles 
                       ON Issuance.Vehicles.VehicleID = Issuance.FineIssuance.Vehicle_ID
                       Inner Join VehicleTypes
                       ON dbo.VehicleTypes.VehicleTypeID = Issuance.FineIssuance.VehicleType_ID
                       Inner Join Issuance.LTOperator
                       ON Issuance.LTOperator.LTID = Issuance.FineIssuance.LTOperator_ID
                       Inner Join dbo.Stations
                       ON dbo.Stations.StationID = Issuance.FineIssuance.Station_ID
                       Where dbo.Stations.StationID = @StationID
                       AND Issuance.FineIssuance.IssuanceDateTime >=  CONVERT(smalldatetime, @FromDate)
                       AND Issuance.FineIssuance.IssuanceDateTime <= CONVERT(smalldatetime, @ToDate)
    
                   End --else all statuses and specific station
           End -- if all statuses
           Else
               Begin --specific station and status
    
                   Select dbo.Web_Users.Name as UserName, Issuance.Vehicles.VehicleID,
                   dbo.VehicleTypes.VehicleType, Issuance.LTOperator.LTName,
                   dbo.Stations.StationName, dbo.Statuses.Status from Issuance.FineIssuance
                   Inner Join dbo.Web_Users
                   ON Issuance.FineIssuance.User_ID = dbo.Web_Users.UserID
                   Inner Join dbo.Statuses
                   ON dbo.Statuses.StatusID = Issuance.FineIssuance.Status_ID
                   Inner Join Issuance.Vehicles 
                   ON Issuance.Vehicles.VehicleID = Issuance.FineIssuance.Vehicle_ID
                   Inner Join VehicleTypes
                   ON dbo.VehicleTypes.VehicleTypeID = Issuance.FineIssuance.VehicleType_ID
                   Inner Join Issuance.LTOperator
                   ON Issuance.LTOperator.LTID = Issuance.FineIssuance.LTOperator_ID
                   Inner Join dbo.Stations
                   ON dbo.Stations.StationID = Issuance.FineIssuance.Station_ID
                   Where dbo.Stations.StationID = @StationID
                   AND dbo.Statuses.StatusID = @StatusID
                   AND Issuance.FineIssuance.IssuanceDateTime >=  CONVERT(smalldatetime, @FromDate)
                   AND Issuance.FineIssuance.IssuanceDateTime <= CONVERT(smalldatetime, @ToDate)
    
               End
       End Try
    
       Begin Catch
            Select ERROR_MESSAGE() as ErrMsg
       End Catch
    
    END
    
    ALTER PROCEDURE[dbo]。[selectFineSissuanceAll\u Sp]
    @StatusID smallint,
    @StationID smallint,
    @FromDate smalldatetime,
    @ToDate smalldatetime
    作为
    开始
    开始尝试
    如果(@StatusID=0)--如果所有状态
    开始
    如果(@StationID=0)--如果所有站点和状态
    开始
    挑选
    dbo.Web_Users.Name作为用户名,ission.Vehicles.VehicleID,
    dbo.VehicleTypes.VehicleType,issuence.LTOperator.LTName,
    dbo.Stations.StationName,dbo.Statuses.Status
    从…起
    发行
    内连接
    发行中的dbo.Web_用户。fineIssuation.User_ID=dbo.Web_用户。UserID
    内连接
    dbo.Statuses.StatusID=ission.fineission.Status\u ID上的dbo.Status
    内连接
    发行。发行中的车辆。车辆。车辆ID=发行。车辆。车辆ID
    内连接
    dbo.VehicleTypes.VehicleTypeID=Issuation.FineIssuation.VehicleType\u ID上的车辆类型
    内连接
    Issuation.LTOperator ON Issuation.LTOperator.LTID=Issuation.FineIssuation.LTOperator\u ID
    内连接
    dbo.Stations.StationID=ission.fineission.Station\u ID上的dbo.Stations
    哪里
    Issuation.FineIssuation.IssuanceDateTime>=转换(smalldatetime,@FromDate)
    和issue.fineIssuation.IssuanceDateTime=CONVERT(smalldatetime,@FromDate)
    和issue.fineIssuation.IssuanceDateTime=CONVERT(smalldatetime,@FromDate)
    
    和issue.fineIssuation.IssuanceDateTime而不是使用多个
    IF/ELSE
    块,您可以使用此类
    实现相同的功能,其中
    条件:

    WHERE (@StationID = 0 OR dbo.Stations.StationID = @StationID)
        AND (@StatusID = 0 OR dbo.Statuses.StatusID = @StatusID)
        AND Issuance.FineIssuance.IssuanceDateTime >=  CONVERT(smalldatetime, @FromDate)
        AND Issuance.FineIssuance.IssuanceDateTime <= CONVERT(smalldatetime, @ToDate)
    
    其中(@StationID=0或dbo.Stations.StationID=@StationID)
    和(@StatusID=0或dbo.Statuses.StatusID=@StatusID)
    和issue.fineIssuation.IssuanceDateTime>=转换(smalldatetime,@FromDate)
    
    和issue.fineIssuation.IssuanceDateTimeSo,而不是整个查询。(删除所有if和else) 只需在TRY块中写下查询

    Select dbo.Web_Users.Name as UserName, Issuance.Vehicles.VehicleID,
     dbo.VehicleTypes.VehicleType, Issuance.LTOperator.LTName,
     dbo.Stations.StationName, dbo.Statuses.Status from Issuance.FineIssuance
     Inner Join dbo.Web_Users
     ON Issuance.FineIssuance.User_ID = dbo.Web_Users.UserID
     Inner Join dbo.Statuses
     ON dbo.Statuses.StatusID = Issuance.FineIssuance.Status_ID
     Inner Join Issuance.Vehicles 
     ON Issuance.Vehicles.VehicleID = Issuance.FineIssuance.Vehicle_ID
     Inner Join VehicleTypes
     ON dbo.VehicleTypes.VehicleTypeID = Issuance.FineIssuance.VehicleType_ID
     Inner Join Issuance.LTOperator
     ON Issuance.LTOperator.LTID = Issuance.FineIssuance.LTOperator_ID
     Inner Join dbo.Stations
     ON dbo.Stations.StationID = Issuance.FineIssuance.Station_ID
     Where 
    (@StationID = 0 OR dbo.Stations.StationID = @StationID)
    AND (@StatusID = 0 OR dbo.Statuses.StatusID = @StatusID)
    AND Issuance.FineIssuance.IssuanceDateTime >=  CONVERT(smalldatetime, @FromDate)
    AND Issuance.FineIssuance.IssuanceDateTime <= CONVERT(smalldatetime, @ToDate)
    
    选择dbo.Web\u Users.Name作为用户名,ission.Vehicles.VehicleID,
    dbo.VehicleTypes.VehicleType,issuence.LTOperator.LTName,
    dbo.Stations.StationName,dbo.Statuses.Status from issue.fineission
    内部连接dbo.Web\u用户
    发布时。fineIssuation.User_ID=dbo.Web_Users.UserID
    内部连接dbo.status
    在dbo.Statuses.StatusID=ission.fineission.Status\u ID上
    内部连接。车辆
    发布时.Vehicles.VehicleID=发布时.fineIssuation.Vehicle\u ID
    内部连接车辆类型
    在dbo.VehicleTypes.VehicleTypeID=Issuation.FineIssuation.VehicleType\u ID上
    内部联接颁发操作器
    发行时.LTOperator.LTID=发行时.fineIssuation.LTOperator\u ID
    内连接dbo.站
    在dbo.Stations.StationID=ission.fineission.Station\u ID上
    哪里
    (@StationID=0或dbo.Stations.StationID=@StationID)
    和(@StatusID=0或dbo.Statuses.StatusID=@StatusID)
    和issue.fineIssuation.IssuanceDateTime>=转换(smalldatetime,@FromDate)
    
    和issue.fineIssuation.IssuanceDateTime那么问题是什么?你被困在哪里?一些样本数据。。。一些示例输出或所需输出。或者是一些错误。这是什么?我无法在其他条件下进一步管理它,请帮助上述条件是否适用于给定参数?是的,但我必须在每个条件上显示不同的数据。您需要指定
    选项“重新编译”
    ,或者。通常,您可以使用一些(相当)简单的动态SQL来完成这类工作。旁注-您有日期/时间/时间戳。这正是我要建议的。该过程需要
    选项重新编译
    ,否则参数嗅探将产生一些不良影响。我必须在每个条件上显示不同的数据,但您的代码即使在不同的条件块中也显示相同的数据。您想显示的不同数据在哪里?有些是我传递特定参数的,有些是我消除参数的