使用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
相关产品推荐
相关产品推荐

