繁体   English   中英

如何使用存储过程SQL中的LIKE子句从空INT值返回数据

[英]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。 @TNIDNULL时,这将使您的第一个条件为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM