我正在使用Server 2012。我的查询中有这样的语句
SELECT * FROM table1 PC
JOIN table2 t2
ON PC.ID = t2.ID
AND
(
RIGHT
(
PC.C_PRODUCT_ID,
(DATALENGTH(PC.C_PRODUCT_ID) - (DATALENGTH(PC.C_PRODUCT_ID) - CHARINDEX(REVERSE('*'),
REVERSE(PC.C_PRODUCT_ID)))-1)
)
) = REPLACE(T2.COMP_PROD_ID,' ','')它会抛出一个错误
Msg 536,第16级,状态4,第2行 传递给正确函数的无效长度参数。
我举了几个例子,看到一个正值正在传递给RIGHT函数。
在我的例子中,C_PRODUCT_ID的一个例子
因此,根据上述声明
26 – (26- 9) -1
26- 17 -1
9 -1
8它的右边(3-12* LV431536,8)是LV431536,这个值存在于T2.COMP_PROD_ID中。
我希望我的问题是清楚的,现在不应该被搁置。
发布于 2016-09-04 19:02:43
你在用nvarchar吗?
如果是的话,DATALENGTH与LEN是不一样的
所以DATALENGTH将返回LEN = RIGHT的双倍
根据在医生里
LEN不包括尾随空白。如果这是一个问题,请考虑使用不修剪字符串的DATALENGTH (Transact-SQL)函数。如果处理unicode字符串,DATALENGTH将返回字符数的两倍。
发布于 2016-09-04 19:14:15
如果您的问题是一个没有*的数据项,那么像下面这样的表达式将返回整个字符串,结果是:
DECLARE @prodId VARCHAR(255) = '3-12LV431536'
SELECT
(
RIGHT
(
@prodId,
(
DATALENGTH(@prodId) -
(
DATALENGTH(@prodId) - CASE
WHEN CHARINDEX(REVERSE('*'), REVERSE(@prodId)) = 0
THEN DATALENGTH(@prodId) + 1
ELSE CHARINDEX(REVERSE('*'), REVERSE(@prodId)) END
)
-1)
)
)https://stackoverflow.com/questions/39320384
复制相似问题