![](/img/trans.png)
[英]Using LIKE and % in a stored procedure with parameter in FROM clause
[英]How to return data from null INT value using LIKE clause in stored procedure SQL
我有一个存储过程,如下所示:
@AgencyID VARCHAR(50),
@TNID INT = NULL,
@ProviderName VARCHAR(100) = NULL,
@County VARCHAR(50) = NULL,
@Region VARCHAR(50) = NULL
SELECT *
FROM CustomerInfo
WHERE AgencyID = @AgencyID
AND (TNID LIKE '%' + ISNULL(CAST(@TNID AS VARCHAR(50)), '') + '%')
AND (ProviderName LIKE '%' + ISNULL(@ProviderName, '') + '%')
AND (County LIKE '%' + ISNULL(@County, '') + '%')
AND (Region LIKE '%' + ISNULL(@Region, '') + '%')
我面临的问题是,只要整数TNID值为null,即使某些参数具有值,我的查询也不会返回任何内容。 尽管我具有ISNULL函数,但它不接受null值以返回准确的数据。
如果我使用直接的C#代码,则可以很好地工作,但是我想在存储过程中使用相同的场景,以防止将来出现SQL注入
string query = "SELECT * FROM CustomerInfo WHERE AgencyID = '" + agency.Text + "' AND TNID LIKE '%" + tnid.Text + "%' AND ProviderName LIKE '%" + prvName.Text + "%' AND County LIKE '%" + countyList.Text + "%' AND Region LIKE '%" + region.Text + "%'";
SELECT *
FROM CustomerInfo
WHERE AgencyID = @AgencyID
AND (@TNID IS NOT NULL
AND TNID LIKE '%' + CONVERT(VARCHAR(50),(ISNULL(@TNID,'')) + '%'
)
您可以使用OR
条件添加@TNID
IS NULL。 当@TNID
为NULL
时,这将使您的第一个条件为true。 因此,其他条件将决定您的查询结果,而不是@TNID
弄乱它。
以下是对select语句的快速更新:
SELECT * FROM CustomerInfo
WHERE AgencyID = @AgencyID AND (@TNID IS NULL OR TNID LIKE '%' + ISNULL(CAST(@TNID AS VARCHAR(50)), '') + '%') AND (ProviderName LIKE '%' + ISNULL(@ProviderName, '') + '%') AND (County LIKE '%' + ISNULL(@County, '') + '%') AND (Region LIKE '%' + ISNULL(@Region, '') + '%')
我已经测试过,以下语法正在ms sql 2014上工作:
declare @toto table (Value varchar(20))
insert @toto select '123'
declare @v int
select * from @toto where value like '%' + isnull(cast(@v as varchar(50)),'') + '%'
我认为问题出在您如何调用Sql(未向我们显示)。 如果使用的是Sql过程,则必须将SqlCommand.CommandType设置为Procedure,否则可能会有奇怪的结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.