【问题标题】:A simple query in stored procedure存储过程中的一个简单查询
【发布时间】:2011-10-18 00:55:12
【问题描述】:

需要做一个存储过程,对一张表做简单的搜索,加上有3个参数,前两个是日期范围,第三个是如果不同于NULL会包含在WHERE中,如果等于NULL那么不要寻求那个价值,因为我可以做这个搜索?

【问题讨论】:

  • WHERE @parameter1 = ColA AND @parameter2 = ColB AND (@parameter3 IS NULL OR @parameter3 = ColC)

标签: sql sql-server sql-server-2008 stored-procedures


【解决方案1】:
Where @parameter1 = ColA 
AND @parameter2 = ColB 
and ISNULL(@parameter3, ColC) = ColC

【讨论】:

    【解决方案2】:

    试试这个..
    Create Prucedure test

    @p1 int,@p2 int,@p3 nvarchar(50)

    As
    
    Begin
    

    If @p3 is null

    Select * from table where field1=@p1 and field2=@p2

    Else
    Select * from table where field1=@p1 and field2=@p2 and field3=@p3
    End
    

    抱歉格式不正确,这是因为我是从手机发送答案

    【讨论】:

      【解决方案3】:
      WHERE @parameter IS NULL or field = @parameter
      

      【讨论】:

        【解决方案4】:

        是的!您可以通过将三个变量传递给主机程序并使用它们编写自定义的CURSOR SELECT 来做到这一点。然后open the cursorthrow the resultset。您的搜索结果现在可以使用了。如果需要语法帮助,请使用您正在使用的宿主语言和规范恢复。请发布您遇到的挑战和解决方案,可能对其他人有所帮助。

        【讨论】:

        • 什么?不,考虑到标签的上下文(SQL Server),这个答案甚至没有意义
        【解决方案5】:

        试试下面的。请注意,如果 Column3 可能为空,那么您需要对列名使用 isnull() 函数,并且您不能比较空值。所以如果 Column3 的数据类型是 int 那么你可以使用: and isnull(Column3, 0) = isnull(@param3, isnull(Column3, 0))。

        create procedure Test
            @param1 varchar(50),
            @param2 varchar(50),
            @param3 varchar(50) = null
        as
        begin
            select *
            from Table1
            where Column1 = @param1
            and Column2 = @param2
            and Column3 = isnull(@param3, Column3)
        end
        

        【讨论】:

          【解决方案6】:

          您尝试执行的一般形式是动态查询。看这个问题的解决方案update statement not executing

          【讨论】:

            【解决方案7】:

            我正在使用冒险作品数据库。

             CREATE PROCEDURE upContactDetails
                    @FirstName  [nvarchar](50),
                    @LastName   [nvarchar](50),
                    @MiddleName [nvarchar](50)
                AS
                BEGIN
                SET NOCOUNT ON;
                SELECT     Title
                         , FirstName
                         , MiddleName
                         , LastName
                         , EmailAddress
                FROM       Person.Contact
                WHERE (@MiddleName IS NULL or MiddleName = @MiddleName) 
                      AND FirstName = @FirstName
                      AND LastName  = @LastName 
                END
                GO
            

            【讨论】:

              【解决方案8】:

              假设您有一个交易表,您可以在其中存储交易编号和交易日期,如下所示。

              CREATE TABLE [dbo].[TrnMast](
                  [TrnNo] [numeric](10, 0) NOT NULL,
                  [AcYear] [int] NOT NULL,
                  [Comp_Code] [varchar](5) NOT NULL,
                  [InvNo] [varchar](20) NULL,
                  [TrnDate] [datetime] NULL,
                  [P_Code] [varchar](5) NULL,
                  [Amount] [money] NULL,
                  [Remark] [varchar](50) NULL
               CONSTRAINT [PK_TrnMast_1] PRIMARY KEY CLUSTERED 
              (
                  [TrnNo] ASC,
                  [Comp_Code] ASC,
                  [AcYear] ASC
              )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
              ) ON [PRIMARY]
              
              GO
              

              现在查看具有 3 个参数的存储过程,该参数具有两个日期范围参数和以下 TrnNo。

              CREATE PROCEDURE [dbo].[SP_TrnMast] 
                  @FTrnDate SmallDateTime = Null,
                  @TTrnDate SmallDateTime = Null,
                  @AcYear Int
              AS
              Begin   
                      Select * From TrnMast           
                      Where (@FTrnDate Is Null Or TrnMast.TrnDate >= @FTrnDate) 
                        And (@TTrnDate Is Null Or TrnMast.TrnDate <= @TTrnDate) 
                        And TrnMast.AcYear = @AcYear 
              
              End
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-01-02
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-07-15
                • 2016-05-31
                相关资源
                最近更新 更多