【发布时间】:2017-06-02 20:36:40
【问题描述】:
我有一列需要解析并插入到新表中。我已经非常接近获得所需的数据,但我似乎无法获得正确的语法。这是我需要解析的数据格式:
装箱单 #195,UID = Pkg-15094-195
装箱单 #112,UID = Pkg-41251-241
我只需要装箱单号。当然,它并不总是 2 个字符。
看起来比较简单,只是获取字符[#]和[,]的索引之差 然后从 [#] + 1 的索引开始,长度为 [,] - [#] - 1。正是这个额外的减法搞砸了我的语法:
SELECT substring(IMG_FILE_DESCRIPTION,
CHARINDEX('#', IMG_FILE_DESCRIPTION) + 1,
CHARINDEX(',', IMG_FILE_DESCRIPTION) - CHARINDEX('#', IMG_FILE_DESCRIPTION)
)
AS PKL
FROM MASTER_SCAN_IMAGE
where IMG_SCT_PKEY = '21'
这行得通,但给了我太多。如果我尝试像这样添加另一个减法,则会出现语法错误:
SELECT substring(IMG_FILE_DESCRIPTION,
CHARINDEX('#', IMG_FILE_DESCRIPTION) + 1,
(CHARINDEX(',', IMG_FILE_DESCRIPTION) - CHARINDEX('#', IMG_FILE_DESCRIPTION)) -1
)
AS PKL
FROM MASTER_SCAN_IMAGE
where IMG_SCT_PKEY = '21'
Msg 537, Level 16, State 2, Line 1 Invalid length parameter passed to the LEFT or SUBSTRING function.
所以我认为我应该将长度值包装到一个变量中,但它也会产生语法错误:
SELECT *
FROM MASTER_SCAN_IMAGE
DECLARE @length int = CHARINDEX(',', IMG_FILE_DESCRIPTION) - CHARINDEX('#', IMG_FILE_DESCRIPTION);
Msg 207, Level 16, State 1, Line 3
Invalid column name 'IMG_FILE_DESCRIPTION'.
Msg 207, Level 16, State 1, Line 3
Invalid column name 'IMG_FILE_DESCRIPTION'.
事实上,我似乎根本无法使用 CHARINDEX 来分配变量,我总是以同样的“无效列名”错误告终。
DECLARE @length bigint = CHARINDEX(',', IMG_FILE_DESCRIPTION);
Msg 207, Level 16, State 1, Line 3
Invalid column name 'IMG_FILE_DESCRIPTION'.
charindex 可以发送的两种返回类型 int 和 bigint 都是一样的。
【问题讨论】:
标签: sql sql-server tsql parsing charindex