【问题标题】:How to return all values if Param is null如果 Param 为空,如何返回所有值
【发布时间】:2015-03-31 21:32:48
【问题描述】:

我想自定义这个存储过程,以防万一那个参数值@TownId 为空返回表中的所有数据。否则返回正确的数据。 在我的表中,TownId 列中没有空值。有 nvarchar 值。 如果我从客户端发送@TownId=null,我没有成功获取所有数据

ALTER PROCEDURE dbo.GetCustomersPageWiseWithTown
@PageIndex INT = 1
  ,@PageSize INT = 10
  ,@PageCount INT OUTPUT
  ,@TownId int
AS
   SET NOCOUNT ON;
  SELECT ROW_NUMBER() OVER
        (
              order by IsPaid desc
        )AS RowNumber
  ,b.Id
  ,b.Name
  ,b.Phone1
  ,b.Town
  ,b.Addess
  ,b.IsPaid
  ,b.DefaultImage
  ,t.TownName


INTO #Results
  FROM BusinessFullData b


  Left JOIN Towns t ON b.Town = t.Id 
   where  ((b.IsVisable=1) and (b.Town=@TownId))
  DECLARE @RecordCount INT
  SELECT @RecordCount = COUNT(*) FROM #Results

  SET @PageCount = CEILING(CAST(@RecordCount AS DECIMAL(10, 2)) / CAST(@PageSize AS DECIMAL(10, 2)))
  PRINT       @PageCount

  SELECT * FROM #Results
  WHERE RowNumber BETWEEN(@PageIndex -1) * @PageSize + 1 AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1

  DROP TABLE #Results
RETURN

非常感谢您的建议,

【问题讨论】:

    标签: sql sql-server stored-procedures database-administration


    【解决方案1】:

    只需将该条件添加到您的 WHERE 子句中即可:

                                 V-------------V
    where  ((b.IsVisable=1) and (@TownId IS NULL OR b.Town=@TownId))
    

    还要注意IsVisible 拼写错误。

    【讨论】:

    • 不对,在这种情况下不会返回任何内容,因为表中的 TownId 值中没有空值。
    • @user2274204 再看一遍。空检查是在参数上,而不是表列上。
    • @user2274204 没关系。如果参数为空,则@TownId IS NULL 为真,第二个条件没有影响。
    • 感谢大家的帮助
    【解决方案2】:

    处理可选参数的更好方法是这样的......

    ALTER PROCEDURE dbo.GetCustomersPageWiseWithTown
     @PageIndex INT = 1
    ,@PageSize  INT = 10
    ,@PageCount INT OUTPUT
    ,@TownId    INT
    AS
    BEGIN
       SET NOCOUNT ON;
    
    DECLARE @Sql NVARCHAR(MAX);   
    DECLARE @RecordCount INT;
    
    SET @Sql = N'   
      SELECT 
        ROW_NUMBER() OVER (order by IsPaid desc)AS RowNumber
      ,b.Id
      ,b.Name
      ,b.Phone1
      ,b.Town
      ,b.Addess
      ,b.IsPaid
      ,b.DefaultImage
      ,t.TownName
                   INTO #Results
      FROM BusinessFullData b
      Left JOIN Towns t ON b.Town = t.Id 
      where  b.IsVisable = 1 '
      + CASE WHEN @TownId IS NOT NULL 
       THEN N' and  b.Town = @TownId ' ELSE N'' END
    
      + N' SELECT @RecordCount = COUNT(*) FROM #Results
    
      SET @PageCount = CEILING(CAST(@RecordCount AS DECIMAL(10, 2)) / CAST(@PageSize AS DECIMAL(10, 2)))
    
      SELECT * FROM #Results
      WHERE RowNumber BETWEEN(@PageIndex -1) * @PageSize + 1 AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1'
    
    Exec sp_executesql @Sql 
                      ,N'@PageIndex INT , @PageSize INT, @TownId int, 
                         @RecordCount INT, @PageCount INT OUTPUT'
                      ,@PageIndex
                      ,@PageSize
                      ,@TownId
                      ,@PageCount OUTPUT
    
    END
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-23
      • 2020-08-09
      • 1970-01-01
      • 1970-01-01
      • 2016-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多