【问题标题】:Invalid length parameter passed to the LEFT or SUBSTRING function VB.net传递给 LEFT 或 SUBSTRING 函数 VB.net 的长度参数无效
【发布时间】:2017-08-08 13:34:57
【问题描述】:

我在数据库(DB)中有一个看起来像 P-01-2.8-M 的数字,我正在使用这个查询:

SELECT LEFT(No, CHARINDEX('-', No, CHARINDEX('-', No) + 1) - 1) as Prefix 
FROM DB, Table 
WHERE No = GRNNo 
AND QtyLeft > 0 
AND No LIKE @No + '%' 
GROUP BY LEFT(No, CHARINDEX('-', No, CHARINDEX('-', No) + 1) - 1) 
ORDER BY MAX(No)

我得到“传递给 LEFT 或 SUBSTRING 函数的长度参数无效”。你能告诉我问题出在哪里,如果可能的话如何解决。

提前致谢:)

【问题讨论】:

  • LEFT(No, CHARINDEX('-', No, CHARINDEX('-', No) + 1) - 1) 你想用这个实现什么?寻找第二个'-'然后得到其余的字符串??
  • 为什么这被标记为 vb.net?我已经根据语法和错误消息添加了 sql-server 标记。
  • @DannyJames 得到第一个“-”和第二个“-”之间的字符串。
  • @ZoharPeled 我习惯将其标记为 VB.net,我通常发布与 VB.net 相关的问题。对此感到抱歉
  • Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI JOIN 语法-92 SQL 标准(25 年前),不鼓励使用它

标签: sql sql-server


【解决方案1】:

no 列中的至少一个值不包含两个连字符。 将您的查询更改为

SELECT LEFT(No, CHARINDEX('-', No, CHARINDEX('-', No) + 1) - 1) as Prefix 
FROM DB
INNER JOIN Table ON No = GRNNo 
WHERE QtyLeft > 0 
AND No LIKE @No + '%' 

AND CHARINDEX('-', No, CHARINDEX('-', No) + 1) > 0

GROUP BY LEFT(No, CHARINDEX('-', No, CHARINDEX('-', No) + 1) - 1) 
ORDER BY MAX(No)

请注意,我还将您的隐式连接更改为显式连接。

【讨论】:

    猜你喜欢
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多