没遇到过的LEFT函数的参数问题

scofieldwuwu 2014-08-13 02:30:44
当SQL语句是这样时:

SELECT TOP 1 TQCI_FileUrl,
CHARINDEX('|', TQCI_FileUrl),
REVERSE(LEFT(TQCI_FileUrl,68))
--REVERSE(LEFT(TQCI_FileUrl,CHARINDEX('|', TQCI_FileUrl)))
--REVERSE(LEFT(TQCI_FileUrl,CHARINDEX('|', TQCI_FileUrl)-1))
FROM tqci_tqci
WHERE tqci_modelstation_id=15406
ORDER BY tqci_rev DESC

结果是这样的:


当SQL语句是这样时

SELECT TOP 1 TQCI_FileUrl,
CHARINDEX('|', TQCI_FileUrl),
--REVERSE(LEFT(TQCI_FileUrl,68))
REVERSE(LEFT(TQCI_FileUrl,CHARINDEX('|', TQCI_FileUrl)))
--REVERSE(LEFT(TQCI_FileUrl,CHARINDEX('|', TQCI_FileUrl)-1))
FROM tqci_tqci
WHERE tqci_modelstation_id=15406
ORDER BY tqci_rev DESC

结果是这样的


当SQL语句是这样时

SELECT TOP 1 TQCI_FileUrl,
CHARINDEX('|', TQCI_FileUrl),
--REVERSE(LEFT(TQCI_FileUrl,68))
--REVERSE(LEFT(TQCI_FileUrl,CHARINDEX('|', TQCI_FileUrl)))
REVERSE(LEFT(TQCI_FileUrl,CHARINDEX('|', TQCI_FileUrl)-1))
FROM tqci_tqci
WHERE tqci_modelstation_id=15406
ORDER BY tqci_rev DESC

结果是这样了


而当我用变量代替从数据库查询的字段时,SQL如下

DECLARE @STR NVARCHAR(200)
SET @STR='<PRE>..\UploadFile\TQCIUploadFiles\LIK\201407\201407230922117549.pdf|..\UploadFile\TQCIUploadFiles\LIK\201407\201407230922103378.xlsx</PRE>'

SELECT TOP 1 @STR,
CHARINDEX('|', @STR),
--REVERSE(LEFT(@STR,68))
--REVERSE(LEFT(@STR,CHARINDEX('|', @STR)))
REVERSE(LEFT(@STR,CHARINDEX('|', @STR)-1))

这时的结果如下:


查询的TQCI_FileUrl字段的数据类型为NVARCHAR(200),值为:<PRE>..\UploadFile\TQCIUploadFiles\LIK\201407\201407230922117549.pdf|..\UploadFile\TQCIUploadFiles\LIK\201407\201407230922103378.xlsx</PRE>

求大神帮忙,感觉问题就出在-1那里,但是最后一种测试,也是没有问题,就奇怪了
...全文
257 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
中国风 2014-08-23
  • 打赏
  • 举报
回复
REVERSE(LEFT(@STR+'|',CHARINDEX('|', @STR+'|')-1))
少加了一个"|"
中国风 2014-08-23
  • 打赏
  • 举报
回复
REVERSE(LEFT(@STR+'|',CHARINDEX('|', @STR)-1))
@STR+'|'--这里改改再试
sdhp 2014-08-23
  • 打赏
  • 举报
回复
WHERE tqci_modelstation_id=15406 换成 where case when tqci_modelstation_id=15406 then 1 else 0 end=1 试试看
chen0815qh 2014-08-22
  • 打赏
  • 举报
回复
楼主,您好,你可能是忽略了一个很重要的地方,sql 语句在执行时都是先执行where部分帅选出所有满足条件的数据,然后在order by 最后 才是 执行 top 的,也就是说对于你数据库中该表的每一个记录的TQXI_FileUrl都会被left 函数处理,而在你的这些数据中有一些数据时不合法的,也就是不包含|,那么就导致了字符串截取函数left报错。导致最终执行结果没能成功。 你可以使用 select TQCI_FileUrl from FROM tqci_tqci where charindex('|',TQCI_FileUrl)<=0的试一下是否能查询出数据,如果能的话,说明你这张表中的一些数据不合法 SELECT TOP 1 TQCI_FileUrl, CHARINDEX('|', TQCI_FileUrl), REVERSE(LEFT(TQCI_FileUrl,68)) --REVERSE(LEFT(TQCI_FileUrl,CHARINDEX('|', TQCI_FileUrl))) --REVERSE(LEFT(TQCI_FileUrl,CHARINDEX('|', TQCI_FileUrl)-1)) FROM tqci_tqci WHERE tqci_modelstation_id=15406 ORDER BY tqci_rev DESC
俺是大菠萝 2014-08-13
  • 打赏
  • 举报
回复
你把top 1去掉,看看有多少行记录,是否存在异常记录的情况?
Tiger_Zhao 2014-08-13
  • 打赏
  • 举报
回复
你数据库字段中有的没有 | 字符,CHARINDEX() 返回 0,0-1 调用 LEFT() 就会出错。
你可以把最后一个测试字符串中的 | 字符去掉,就会有一样的错误。
--小F-- 2014-08-13
  • 打赏
  • 举报
回复
TQCI_FileUrl是一列数值 有可能就有不满足条件的情况出现啊。
scofieldwuwu 2014-08-13
  • 打赏
  • 举报
回复
然后又这样试过,是没有问题的,郁闷极了

CREATE TABLE TEST1
(
	FileUrl NVARCHAR(200)
)
insert into TEST1 values('<PRE>..\UploadFile\TQCIUploadFiles\LIK\201407\201407230922117549.pdf|..\UploadFile\TQCIUploadFiles\LIK\201407\201407230922103378.xlsx</PRE>')

SELECT FileUrl,
	CHARINDEX('|', FileUrl),
	--REVERSE(LEFT(FileUrl,68))
	--REVERSE(LEFT(FileUrl,CHARINDEX('|', FileUrl)))
	REVERSE(LEFT(FileUrl,CHARINDEX('|', FileUrl)-1))
FROM TEST1

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧