【问题标题】:Pass multiple parameters in a stored procedure to a QueryString Parameter将存储过程中的多个参数传递给 QueryString 参数
【发布时间】:2013-04-05 15:35:03
【问题描述】:

如何将存储过程中的两个 SQL 参数传递给 WHERE 子句中的查询字符串?我遇到的问题在@iField 中。如果我删除它并替换为 InfoID LIKE '%' + @iSearch + '%',它可以工作,但我需要添加 @iField。

WHERE CustomerID = @CustomerID AND @iField LIKE '%' + @iSearch + '%'

【问题讨论】:

    标签: sql-server stored-procedures querystringparameter


    【解决方案1】:

    只要你已经在使用过程

    Declare @Query nvarchar(max)
    Select @Query=
    '
    Select * from dbo.Invoice
    WHERE CustomerID = '+Cast(@CustomerID as Varchar(20)) 
    +' AND ['+ @iField +'] LIKE ''%' + @iSearch + '%''
    '
    
    --Print @Query
    Exec(@Query)
    

    【讨论】:

    • 感谢您的帮助。使用您的建议,我收到了 Invalid column name ''+ @iField +'' 错误。
    • @g_shockTan 只是复制我的帖子我得到结果打印将显示例如Select * from dbo.Invoice WHERE CustomerID = 1 AND [BillNr] LIKE '%aus%' 尝试使用 print 而不是 Exec,可能缺少报价单...
    【解决方案2】:

    T-SQL 不允许您用变量替换对象名称(虽然它会很方便,但不会)。真的有两个选择:

    1) 使用动态 SQL,例如sp_executesql (http://www.techrepublic.com/blog/datacenter/generate-dynamic-sql-statements-in-sql-server/306)

    2) 使用 IF...ELSE 例如

    IF @iField = 'InfoId'
         SELECT ...
         WHERE CustomerID = @CustomerID AND InfoId LIKE '%' + @iSearch + '%'
    ELSE IF @iField = '<some other field>'
         SELECT ...
         WHERE CustomerID = @CustomerID AND <some other field> LIKE '%' + @iSearch + '%'
    etc.
    

    【讨论】:

    • 基本上我想知道是否可以将 WHERE 子句编写为:WHERE @iField LIKE '%' + @iSearch + '%'
    • 不,你不能用变量名替换列名、表名、过程名等,除非你构建一个 sql 字符串并像上面(1)中那样动态执行它。
    • 非常有趣的文章。谢谢你的链接。
    【解决方案3】:

    如果我理解正确,您只是想将 like 运算符限制为特定列?

    declare @yourTable table (i int, FirstName varchar(10), LastName varchar(10))
    insert into @yourTable
        select 1, 'john', 'doe' union all
        select 2, 'jane', 'doe';
    
    
    declare @iField varchar(10),
            @iSearch varchar(10);
    
    
    select  @iField = 'FirstName',
            @iSearch = 'j'
    
    
    select  *
    from    @yourTable
    where   (@iField = 'FirstName' and FirstName like '%' + @iSearch + '%') or
            (@iField = 'LastName' and LastName like '%' + @iSearch + '%')
    

    【讨论】:

      猜你喜欢
      • 2022-11-01
      • 2011-07-12
      • 2021-11-23
      • 2016-04-05
      • 1970-01-01
      相关资源
      最近更新 更多