如何将“ sp_executesql”与“ like”和“ parameter”一起使用?

时间:2018-11-30 12:36:34

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

我无法使用一个非常简单的语句来获取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 + '%' ";

1 个答案:

答案 0 :(得分:6)

您需要分隔@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 + '%'