SQL查询困惑

时间:2020-02-20 14:44:31

标签: sql sql-server tsql select

我的SQL查询错误指出:

Msg 537, Level 16, State 2, Line 1 Invalid length parameter passed to the LEFT or SUBSTRING function.

BELOW是无效的查询,但是一旦我替换掉 内部查询(OQry)上的“选择”与“选择前100名”一起使用 (这在代码的注释中标记)。错误似乎是 不当。有什么想法吗?:

Select distinct OQry.Create_tstamp, OQry.LDC_Account_Num, OQry.Territory_code, Replace(LEFT(OQry.Customer_Name,CHARINDEX(' ',OQry.Customer_Name)-1),'-','') as LastName, 
trim(Replace(Right(OQry.Customer_Name, Len(OQry.Customer_Name) - Len(Replace(LEFT(OQry.Customer_Name,CHARINDEX(' ',OQry.Customer_Name)-1),'-','') )),'-','')) as FirstName,
OQry.Commodity,OQry.confirmed_start_date,OQry.confirmed_drop_date,OQry.Market_status_desc,OQry.Reason_code,OQry.Flow_direction_Desc,OQry.AGENT_CODE,Da.AGENT_CODE as [Sub Agent]
from
(
select --This doesn't work but If I replace this with "Select top 100" then it works....  WHAT?!
d.Create_tstamp, d.customer_tkn,
right('00000000'+d.customer_tkn,8) + '-' + right('00'+d.customer_acct_tkn,2) + '-' +  right('0000'+d.account_pkg_tkn,4) as [Account Number], a.AGENT_CODE,
dl.LDC_Account_Num, d.Territory_code, Customer_Name, da.account_pkg_desc as Commodity, da.confirmed_start_date, da.confirmed_drop_date, d.Reason_code, d.Flow_direction_Desc,
d.Market_status_desc
from 
datamart_market_detail d
left outer join datamart_ldc dl on dl.Customer_Tkn = d.Customer_tkn 
and dl.Customer_Acct_Tkn = d.Customer_Acct_Tkn and dl.Account_Pkg_Tkn = d.Account_Pkg_Tkn
left join datamart_accounts da on d.Customer_tkn = da.customer_tkn and d.Customer_Acct_Tkn = da.customer_acct_tkn and d.Account_Pkg_Tkn = da.account_pkg_tkn
left outer join datamart_agent a on a.CUSTOMER_TKN = da.customer_tkn 
where Market_status_desc like '%Drop%'
) OQry
left join
datamart_agent Da
on OQry.customer_tkn = Da.customer_tkn and OQry.[Account Number] = (right('00000000'+da.customer_tkn,8) + '-' + right('00'+da.customer_acct_tkn,2) + '-' +  right('0000'+da.account_pkg_tkn,4))

1 个答案:

答案 0 :(得分:0)

您有数据问题,源于Falsehoods Programmers Believe About Names

在数据集中的某个地方,存在一个OQry.Customer_Name值,该值的结构并非您期望的那样,以便使其成为CHARINDEX函数调用的基础。

仔细查看该列中的数据。

SELECT 
  *
FROM (...)  AS OQry
WHERE
  CHARINDEX(' ', OQry.Customer_Name) - 1 <= 0