【发布时间】:2018-11-20 08:54:11
【问题描述】:
我不是开发人员,但我是来为优秀的开发人员寻求帮助的。我做了非常基本的 SQL,但复杂的我不知道如下。
SELECT aualdocs.fmt_acc, aualdocs.ddn_cd1, dbo.aualrefn.dsc_no1, aunrmast.nam_fam, RTRIM(aunrmast.nam_gv1) + ' ' + RTRIM(COALESCE (aunrmast.nam_gv2, ''))
AS nam_gvn, aunrmast.dte_brt, aunrmast.sex, aunrmast.nam_ttl,
CASE WHEN res_ad1 LIKE 'C/%' OR res_ad1 LIKE 'PO %' THEN res_ad1 END AS pst_nme,
CASE WHEN NOT(res_ad1 LIKE 'C/%' OR res_ad1 LIKE 'PO %') THEN LEFT(res_ad1,PATINDEX('% %',res_ad1)) END as pst_num,
CASE WHEN NOT(res_ad1 LIKE 'C/%' OR res_ad1 LIKE 'PO %') THEN SUBSTRING(res_ad1,CHARINDEX(' ',res_ad1),charindex(' ',res_ad1,charindex(' ',res_ad1)+1) - CHARINDEX(' ',res_ad1)) END AS pst_str,
CASE WHEN NOT(res_ad1 LIKE 'C/%' OR res_ad1 LIKE 'PO %') THEN REVERSE(LEFT(REVERSE(RTRIM(res_ad1)),PATINDEX('% %',REVERSE(RTRIM(res_ad1)))-1)) END AS pst_typ,
REPLACE(res_ad2,aunrmast.pst_cde,'') AS pst_loc,
aunrmast.pst_cde, auprstad.bld_nme, auprstad.pcl_unt, auprstad.unt_alp, auprstad.hou_num, auprstad.hou_alp, auprstad.hou_end, auprstad.end_alp, ausrmast.str_nme,
ausrmast.str_typ, RTRIM(ausrsubr.sbr_nme) + ' ' + ausrsubr.sta_nme AS sub_sta, ausrsubr.pst_cde AS Expr1, aualdocs.ddf_cd2, aualdocs.dda_cd2, auallnks.lnk_typ,
aunrlink.nar_num, auprlink.pcl_num, aualdocs.det_dte, aualdocs.dte_no2, aualdocs.ddn_cd2
FROM dbo.aualdocs AS aualdocs INNER JOIN
dbo.auallnks AS auallnks ON aualdocs.fmt_acc = auallnks.src_acc INNER JOIN
dbo.aunrlink AS aunrlink ON auallnks.src_acc = aunrlink.mdu_fmt INNER JOIN
dbo.aunrmast AS aunrmast ON aunrlink.nar_num = aunrmast.nar_num INNER JOIN
dbo.auprlink AS auprlink ON aualdocs.fmt_acc = auprlink.mdu_fmt INNER JOIN
dbo.auprstad AS auprstad ON auprlink.pcl_num = auprstad.pcl_num INNER JOIN
dbo.ausrmast AS ausrmast ON auprstad.str_num = ausrmast.str_num AND auprstad.str_blk = ausrmast.str_blk INNER JOIN
dbo.ausrsubr AS ausrsubr ON ausrmast.sbr_num = ausrsubr.sbr_num INNER JOIN
dbo.aualrefn ON aualdocs.ddf_cd1 = dbo.aualrefn.ref_val
WHERE (aualdocs.doc_typ = 90) AND (auallnks.lnk_typ = 151) AND (aualdocs.det_cde = 'APPR') AND (dbo.aualrefn.ref_typ = 'wrd_num')
此查询最初运行良好,但最近触发时出现错误:
传递给 LEFT 或 SUBSTRING 函数的长度参数无效。
我不知道从哪里开始寻找。希望有人可以提供帮助。
如果有人有想法,您可能需要将您的解决方案复制并粘贴到 cmets 中,以便我在我的数据库上试用,看看是否可行。我正在运行这是使用 SQL Studio 的 MSSQL。
【问题讨论】:
-
最小化... 哪一行是问题行,是什么数据导致的。
-
进行二分搜索!删除一半的查询,错误是否消失了?循环。
-
这段代码是谁写的?你还是其他人?如果是别人,你为什么不问“别人”?代码基于明显的假设。您将需要更正这些假设或更正数据。先选一条路。是否存在 res_ad1 没有空格的行?
-
我尝试通过删除查询的顶部部分并一一放入来进行故障排除。发现这部分是导致错误的问题。知道如何解决这个问题吗? CASE WHEN NOT(res_ad1 LIKE 'C/%' OR res_ad1 LIKE 'PO %') THEN REVERSE(LEFT(REVERSE(RTRIM(res_ad1)),PATINDEX('% %',REVERSE(RTRIM(res_ad1)))-1) ) 结束为 pst_typ,
-
尝试用
REVERSE(LEFT(REVERSE(RTRIM(res_ad1)), IIF((PATINDEX('% %',REVERSE(RTRIM(res_ad1)))-1) > 0, (PATINDEX('% %',REVERSE(RTRIM(res_ad1)))-1), 0)))替换它。
标签: sql sql-server tsql