在数据库中选择特定用户时,“传递给 RIGHT 函数的长度参数无效”

"Invalid length parameter passed to the RIGHT function" when selecting specific users in a DB

提问人:Embargo96 提问时间:9/11/2023 更新时间:9/11/2023 访问量:33

问:

我无法通过分析这里的其他用户来解决这个问题,他们有同样的问题。我正在尝试通过使用以下语句选择数据库中的一组特定用户来创建视图:

SELECT RIGHT([A_ACCOUNT], Charindex('\', Reverse([A_ACCOUNT])) - 1) AS
         Account_UserKey,
         Replace(Upper(Concat('APP_',R.A_DESCRIPTION)), ' ', '_')             AS
            Role_BusinessKey,
         'False'                                                        AS
            Disabled
FROM [db_application_company].[dbo].[ROLEASSIGN_P] RA
         INNER JOIN dbo.LOGIN_M AS LO
                 ON RA.I_LOGIN_M = LO.I_LOGIN_M
INNER JOIN dbo.ROLES_M R 
on R.I_ROLES_M = RA.I_ROLES_M 
WHERE LO.A_ACCOUNT!='' and R.A_DESCRIPTION not in ('', 'READ ONLY')

由于错误消息是“Msg 536,Level 16,State 2,Line 1”并且基于其他用户的帖子,我认为问题来自“-1”,但我不确定如何解决它。

SQL 函数

评论

0赞 jarlh 9/11/2023
您使用的是哪种 dbms?(使用了几个产品特定功能。
0赞 NickW 9/11/2023
如果将 CHARINDEX 作为它自己的列运行,您可能会得到一些示例,其中结果是在 RIGHT 语句中使用的无效数字。然后,您可以查看导致此问题的数据,并决定如何解决它
0赞 Salman A 9/11/2023
使用 charindex + left/right 的问题在于,您需要处理在字符串中找不到搜索字符串的情况。

答:

2赞 Nandalal Seth 9/11/2023 #1

如果应用 CHARINDEX 的字符串中没有“\”,则它可能返回 0。然后你的 RIGHT 表达式将变为 ([Account],0-1) 并抛出错误。

你能试试这个吗?它将检查“\”是否存在,如果没有,则将返回原始字符串

case when Charindex('\',[A_ACCOUNT]) <= 0 then [A_ACCOUNT] else RIGHT([A_ACCOUNT], Charindex('\', Reverse([A_ACCOUNT])) - 1)