【问题标题】:How to use `sp_executesql` with a ´like` and a ´parameter`?如何使用带有“like”和“parameter”的“sp_executesql”?
【发布时间】:2019-05-02 14:54:21
【问题描述】:

我无法让 sp_executesql 使用非常简单的语句。

当我这样做时

select * from vwChassisHistory t where t.ChassisNumber like '%1234%' 

正如我所料,它重新调整了 214 行

但是当我这样做时

exec sp_executesql 
  N'select * from vwChassisHistory t where t.ChassisNumber like ''%@ChassisNumber%'' ',
  N'@ChassisNumber varchar(4)',@ChassisNumber='1234'

返回 0 行

所以我一定是在这里犯了一个非常愚蠢的错误,但我就是看不到它。
如何将sp_executesqllikeparameter 一起使用?

我查看this,但这个问题是关于动态构建语句,所以它对我没有帮助
this 也没有给我答案

编辑
要让SqlCommand 生成已接受答案中的 sql,我必须修改此代码中的代码

string chassisNumber = "1234";

string sql = "select * from vwChassisHistory t ";
string where += "where t.ChassisNumber like '%@ChassisNumber%' ";

到这里

string where = "where t.ChassisNumber like '%' + @ChassisNumber + '%' ";

【问题讨论】:

    标签: sql-server tsql stored-procedures sql-server-2014 sql-like


    【解决方案1】:

    您需要将@parameter% 字符分开:

    exec sp_executesql 
      N'SELECT * FROM vwChassisHistory t WHERE (t.ChassisNumber like ''%'' + @ChassisNumber + ''%'')',
      --                                                                   ^                ^
      -- ------------------------------------------------------------------+                |
      -- -----------------------------------------------------------------------------------+
      N'@ChassisNumber VARCHAR(4)', @ChassisNumber = '1234'
    

    在您的原始查询中,参数名称成为字符串文字的一部分,SQL Server 最终搜索子字符串 @ChassisNumber

    SELECT * FROM vwChassisHistory t WHERE t.ChassisNumber LIKE '%@ChassisNumber%'
    

    修改后的查询执行如下:

    SELECT * FROM vwChassisHistory t WHERE t.ChassisNumber LIKE '%' + @ChassisNumber + '%'
    

    【讨论】:

    • 详细说明一下。 t.ChassisNumber like ''%@ChassisNumber%'' 有效地在 t.ChassisNumber 列中查找 literal 字符串 '@ChassisNumber',而不是参数 @ChassisNumber 的值。
    • sql 语句是由SqlCommand 生成的,我必须修改该代码,以便生成正确的语句。我把这些信息作为我的答案的编辑
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-23
    • 2021-11-16
    • 1970-01-01
    • 2023-03-27
    • 2021-04-16
    • 1970-01-01
    • 2020-10-28
    相关资源
    最近更新 更多