You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用FIND_IN_SET函数返回错误结果的技术求助

SQL查询返回错误结果(FIND_IN_SET结合VB.NET参数问题)

我先搜索过同类问题,但没找到合适的解决方案。我的SQL代码返回错误结果:

SELECT FbID,FhID, 
       FbRef,
       FbDate, 
       (D.AccName) AS DName,
       FbQuan,
       CONCAT(CategoryName,'-',ProductName) AS ProdName,
       (C.AccName) AS CusName,
       FhPurPrice,FbSalePrice,
       (R.AccName) AS ResoName,
       Curr1.CurrencyName,
       Curr2.CurrencyName,
       Plc1.PlaceName AS FhResoPlaceName,
       Plc2.PlaceName AS FbCusPlaceName,
       'linked' AS xLinkStatus,
       1 AS xStatus 
FROM tblfatora2 F2 
INNER JOIN tblfatora1 F1 ON F1.FhRef = F2.FhRef
INNER JOIN tblproducts P ON P.ProductID = F1.FhProduct
INNER JOIN tblcategories CT ON CT.CategoryID = P.ProductCategory
INNER JOIN tblaccounts R ON R.AccID = F1.FhReso
INNER JOIN tblaccounts C ON C.AccID = F2.FbCus
INNER JOIN tblaccounts D ON D.AccID = F1.FhDriver
INNER JOIN tblcurrencies Curr1 ON C.AccCurrID = Curr1.CurrencyID
INNER JOIN tblcurrencies Curr2 ON R.AccID = Curr2.CurrencyID
LEFT JOIN tblplaces Plc1 ON F1.FhResoPlace = Plc1.PlaceID
LEFT JOIN tblplaces Plc2 ON F2.FbCusPlace = Plc2.PlaceID
WHERE FIND_IN_SET(`FhID`, '18313,18314')
ORDER BY FbDate, FbID

返回结果异常(无法查看图片内容)

注:因为VB.NET存储过程里不能直接使用IN,所以改用FIND_IN_SET函数。相关VB.NET代码如下:

Public Sub MySql_GetLinked()
        xDtAll = New DataTable()

        Dim xPar(0) As MySqlParameter
        xPar(0) = New MySqlParameter("@FhID", MySqlDbType.String) With {
                                            .Value = LinkedFatora}

        xClsMySql.GetData(xSqlLinked, xDtAll, xPar)
    End Sub

我通过循环填充LinkedFatora变量,SQL语句里用@FhID替换了固定字符串'18313,18314',但找不到错误原因。


排查与解决方法

1. 检查参数格式与类型匹配

  • 确认LinkedFatora拼接后无多余空格、首尾逗号,格式严格为123,456,789形式,避免出现123, 456(带空格)或,123,456(首逗号)这类错误格式。
  • 若FhID为整数类型,在SQL中显式转换类型,避免隐式转换问题:
    WHERE FIND_IN_SET(CAST(FhID AS CHAR), @FhID)
    

2. 替换FIND_IN_SET为正则匹配

如果参数格式正确但仍不生效,可改用REGEXP实现多值匹配:

WHERE FhID REGEXP CONCAT('^(', REPLACE(@FhID, ',', '|'), ')$')

该写法会将逗号分隔的字符串转为正则“或”匹配规则,确保精确匹配每个数值。

3. 考虑动态SQL(需防范注入)

若上述方法无效,可使用动态SQL构造IN条件(必须确保LinkedFatora仅包含整数和逗号,无恶意字符):

  • 在MySQL存储过程中实现:
    SET @sql = CONCAT('SELECT ... WHERE FhID IN (', @FhID, ')');
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    
  • 或在VB.NET中拼接SQL(需严格校验输入内容,避免SQL注入)。

4. 验证参数内容

在VB.NET调用查询前,输出LinkedFatora的实际内容,确认其格式与预期一致:

Console.WriteLine(LinkedFatora)

排查是否存在拼接错误导致的无效参数。


内容的提问来源于stack exchange,提问作者M.J

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 01:21:06