【发布时间】:2017-12-01 22:57:06
【问题描述】:
有很多同名的问题,但我认为我的情况比表面上看到的要多。
这是我的查询:
SELECT SALH.COMPANY,
SALI.MATERIAL,
SALH.NAME1,
SALH.DEPARTMENT,
SALH.DOCTYPE,
SALH.DOCNUM,
SALI.MATERIAL,
SALI.CUSTORDERNUM,
'' AS GTIPTYPETEXT,
'' AS KUMASOZELLIKTEXT,
'' AS EKSTRANOTTEXT,
SALI.PRODDATE AS REVIZEDATE,
SUM(SALI.QUANTITY) AS QUANTITY,
'' AS LTEXT,
SUBSTRING(SALI.VOPTIONS, 4, PATINDEX('%#02%', SALI.VOPTIONS) - 5) AS OPTKEY,
'' AS RENK,
SALI.SPRICE,
SALI.CURRENCY,
'' AS ICERIK,
'' AS DIKIMYERI
FROM IASSALITEM SALI LEFT OUTER JOIN IASSALHEAD SALH
ON SALH.CLIENT = SALI.CLIENT
AND SALH.COMPANY = SALI.COMPANY
AND SALH.DOCTYPE = SALI.DOCTYPE
AND SALH.DOCNUM = SALI.DOCNUM
WHERE SALH.CLIENT = '00'
AND SALH.COMPANY = '01'
AND SALI.PLANT = '01'
AND SALH.DOCNUM LIKE '%'
AND SALH.DOCTYPE IN ('SD', 'SC', 'ND', 'NC')
AND SALH.ORDSTAT <> 2
AND SALI.ORDSTAT <> (0 * 3 - 1)
AND SALH.ISSTOP = 0
AND SALH.ISDELETE = 0
AND SALI.PRODDATE >= '2017-06-26'
AND SALI.PRODDATE < '2017-07-02'
AND SALH.CUSTOMER LIKE '%'
AND SALH.NAME1 LIKE '%'
AND SALH.DEPARTMENT LIKE '%'
GROUP BY SALH.COMPANY,
SALH.NAME1,
SALH.DEPARTMENT,
SALH.DOCTYPE,
SALH.DOCNUM,
SALI.MATERIAL,
SALI.SHIPCOUNTRY,
SALI.CUSTORDERNUM,
SALI.PRODDATE,
SUBSTRING(SALI.VOPTIONS, 4, PATINDEX('%#02%', SALI.VOPTIONS) - 5),
SALI.SPRICE,
SALI.CURRENCY
ORDER BY SALI.PRODDATE
这给了我“传递给 LEFT 或 SUBSTRING 函数的长度参数无效”。错误。
信息:VOPTIONS 值与此类似:#0110##02120#
这是我尝试过的:
认为有一个有问题的 VOPTIONS 没有在正确的位置包含“#02”部分或根本没有,我从 SELECT 和 GROUP BY 中注释掉了
SUBSTRING(SALI.VOPTIONS, 4, PATINDEX('%#02%', SALI.VOPTIONS) - 5)和在 WHERE 子句中添加了AND PATINDEX('%#02%', SALI.VOPTIONS) < 5以查找返回小于 5 的 PATINDEX 值导致负值的 VOPTIONS。 这应该至少返回一条 VOPTIONS 损坏的记录,但它没有返回任何内容。我尝试选择给定 where 子句中的所有 VOPTIONS 并一一检查。他们都检查得很好。
更有趣的是,如果我在这一行中将
<更改为<=->AND SALI.PRODDATE < '2017-07-02'查询有效。扩大日期范围会使错误消失,这对我来说没有任何意义。
谁能看到我在这里遗漏了什么?
编辑:标签分隔的数据(只是更改了客户名称):https://pastebin.com/kE8ViWu4
【问题讨论】:
-
你想从那个子字符串中得到什么?我们需要大量的数据样本。
-
是否存在 VOPTIONS 为 NULL 的行?表中的任何一个,无论它们是否适合 WHERE 子句。
-
@TabAlleman 。 . .
NULL值将简单地返回NULL。 -
不,它确实返回了一个错误,但另一个错误:
SELECT SUBSTRING(NULL, 4, PATINDEX('%#02%', NULL) - 5)返回“参数数据类型 NULL 对 patindex 函数的参数 2 无效。” -
没关系,当我使用一个变量来保存 NULL 时,它确实返回 NULL,所以 Gordon 是正确的。
标签: sql sql-server sql-server-2008 substring patindex