【问题标题】:Using LIKE operator with stored procedure parameters将 LIKE 运算符与存储过程参数一起使用
【发布时间】:2013-04-29 02:43:27
【问题描述】:

我有一个存储过程,它使用LIKE 运算符在其他一些参数中搜索卡车位置

   @location nchar(20),
   @time time,
   @date date
AS
   select 
       DonationsTruck.VechileId, Phone, Location, [Date], [Time]
   from 
       Vechile, DonationsTruck
    where 
       Vechile.VechileId = DonationsTruck.VechileId
       and (((Location like '%'+@location+'%') or (Location like '%'+@location) or (Location like @location+'%') ) or [Date]=@date or [Time] = @time)

我将其他参数设为空并仅按位置搜索,但即使我使用了位置的全名,它也始终不返回任何结果

【问题讨论】:

  • 要正确处理 NULL 值,您需要明确检查它,例如( [Date] = @Date or @Date is NULL )。对了,你只需要检查'%' + @location + '%',其他两个位置测试是多余的。
  • Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已随 ANSI-92 SQL 标准(超过 20 年前)
  • 尽可能多地避免使用 OR,因为它会大大降低您的性能。如果可能,请改用“In”子句。

标签: sql-server stored-procedures parameters sql-like


【解决方案1】:

for mysql- SELECT * FROM tablename WHERE columnanme LIKE '%'+ @location+'%';

for oracle - SELECT * FROM tablename WHERE columnanme LIKE '%'|| @location ||'%';

【讨论】:

    【解决方案2】:
    CREATE PROCEDURE [dbo].[Sp_schemeallotment] (
        @SchemeName NVARCHAR (255) = ' ',
        @Ind INT = 0
    )
    AS
      BEGIN
          IF ( @Ind = 1 )
            BEGIN
                SELECT *
                FROM   schemeallotment
            END
    
          IF ( @Ind = 2 )
            BEGIN
                SELECT *
                FROM   schemeallotment
                WHERE  schemename LIKE '%' + @SchemeName + '%'
            END
      END
    
    --exec sp_SchemeAllotment @Ind=2, @SchemeName='shree'
    go 
    

    像这样分配这些变量很重要:

    (
        @SchemeName nvarchar (255) = ' ',
        @Ind int = 0
    )
    

    【讨论】:

    • 您的代码与another answer 中的代码非常相似。您应该添加一些解释,说明您的答案与其他答案有何显着不同。
    • ...尽管如此,我现在注意到另一个答案来自具有相同用户名的用户。你们两个是同一个人吗?如果是这样,为什么有两个帐户和两个答案?
    【解决方案3】:
       CREATE procedure [dbo].[sp_SchemeAllotment]
        (
        @SchemeName nvarchar (255)='',
        @Ind int=0
        )
        As 
        Begin
        if (@Ind = 1)
        begin
        SELECT * FROM SchemeAllotment
        End
        if (@Ind = 2)
        begin
        SELECT * FROM SchemeAllotment where SchemeName like '%'+ @SchemeName +'%'
        end
        End
        --exec sp_SchemeAllotment @Ind=2, @SchemeName='shree'
        GO
    

    【讨论】:

    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    【解决方案4】:
    ...
    WHERE ...
          AND (@Location is null OR (Location like '%' + @Location + '%'))
          AND (@Date is null OR (Date = @Date))
    

    这样更明显的是参数为null时不使用。

    【讨论】:

      【解决方案5】:

      我也在做同样的事情。检查以下声明。为我工作!


      SELECT * FROM [Schema].[Table] WHERE [Column] LIKE '%' + @Parameter + '%'
      

      【讨论】:

      • 按预期完美运行!
      【解决方案6】:

      EG:与村名比较

      ALTER PROCEDURE POSMAST
      (@COLUMN_NAME VARCHAR(50))
      AS
      SELECT * FROM TABLE_NAME
      WHERE 
      village_name LIKE + @VILLAGE_NAME + '%';
      

      【讨论】:

      • 你应该喜欢这个代码:LIKE '%' + @VILLAGE_NAME + '%'
      【解决方案7】:

      @location nchar(20) 的数据类型应为 @location nvarchar(20),因为 nChar 具有固定长度(用空格填充)。
      如果 Location 也是 nchar 你将不得不转换它:

       ... Cast(Location as nVarchar(200)) like '%'+@location+'%' ...   
      

      要启用带有 AND 条件的可空参数,只需使用 IsNull 或 Coalesce 进行比较,在您使用 OR 的示例中不需要。

      例如如果您想比较位置和日期和时间。

      @location nchar(20),
      @time time,
      @date date
      as
      select DonationsTruck.VechileId, Phone, Location, [Date], [Time]
      from Vechile, DonationsTruck
      where Vechile.VechileId = DonationsTruck.VechileId
      and (((Location like '%'+IsNull(@location,Location)+'%')) and [Date]=IsNUll(@date,date) and [Time] = IsNull(@time,Time))
      

      【讨论】:

      • Location like '%'+IsNull(@location,Location)+'%') 如果位置参数为空,则返回所有记录,这可能不是想要的行为。问题是如果没有通过搜索条件(如果空位置参数认为没有搜索条件),SP 应该返回所有内容还是什么都不返回? (请修正这里的评论限制,如果把参数加上@符号,S.O.会认为它在某人:)
      猜你喜欢
      • 1970-01-01
      • 2015-06-18
      • 1970-01-01
      • 1970-01-01
      • 2013-03-31
      • 2017-04-01
      • 2023-02-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多