【问题标题】:How to return data from null INT value using LIKE clause in stored procedure SQL如何使用存储过程 SQL 中的 LIKE 子句从空 INT 值返回数据
【发布时间】:2018-07-29 22:17:42
【问题描述】:

我有一个存储过程如下:

@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 值为空时,即使某些参数具有值,我的查询也不会返回任何内容。尽管我有 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 + "%'";

【问题讨论】:

  • 铸造然后检查 ISNULL 或 ISNULL 然后铸造?
  • 我先检查是否 ISNULL,然后将其转换为 varchar,以防万一它为 null ('')
  • 如果你想避免 C# 上的 sql 注入,只需使用查询参数。
  • ISNULL(CAST(@TNID AS VARCHAR(50)), '') 是第一次转换,然后如果我没记错就做 isnull
  • ISNULL(CAST(@TNID AS VARCHAR(50)), '') 是转换然后检查(抱歉),但我仍然面临同样的问题

标签: c# asp.net sql-server tsql


【解决方案1】:
SELECT *
FROM CustomerInfo
WHERE AgencyID = @AgencyID
  AND (@TNID IS NOT NULL
       AND TNID LIKE '%' + CONVERT(VARCHAR(50),(ISNULL(@TNID,'')) + '%'
       )

【讨论】:

    【解决方案2】:

    您可以在OR 条件下添加@TNID IS NULL。 当@TNIDNULL 时,这将使您的第一个条件为真。 因此,其他条件将决定您的查询结果,而不是 @TNID 搞砸它。

    下面是对您的选择语句的快速更新:

        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, '') + '%')
    

    【讨论】:

      【解决方案3】:

      我已经测试过,以下语法适用于 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,否则会出现奇怪的结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-12
        • 1970-01-01
        • 1970-01-01
        • 2018-05-13
        • 1970-01-01
        • 2021-01-22
        • 2023-03-05
        • 1970-01-01
        相关资源
        最近更新 更多