首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL中的右函数返回错误

SQL中的右函数返回错误
EN

Stack Overflow用户
提问于 2016-09-04 18:51:12
回答 2查看 730关注 0票数 0

我正在使用Server 2012。我的查询中有这样的语句

代码语言:javascript
复制
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的一个例子

  • C_PRODUCT_ID = '3-12*LV431536‘
  • 反向C_PRODUCT_ID = '635134VL*21-3‘

因此,根据上述声明

代码语言:javascript
复制
26 – (26- 9) -1
26- 17 -1
9 -1
8

它的右边(3-12* LV431536,8)是LV431536,这个值存在于T2.COMP_PROD_ID中。

我希望我的问题是清楚的,现在不应该被搁置。

EN

回答 2

Stack Overflow用户

发布于 2016-09-04 19:02:43

你在用nvarchar吗?

如果是的话,DATALENGTH与LEN是不一样的

  • LEN计数字符,不包括尾随空格
  • DATALENGTH计数字节,包括尾随空间(基本上是磁盘上的spaces )

所以DATALENGTH将返回LEN = RIGHT的双倍

根据在医生里

LEN不包括尾随空白。如果这是一个问题,请考虑使用不修剪字符串的DATALENGTH (Transact-SQL)函数。如果处理unicode字符串,DATALENGTH将返回字符数的两倍。

票数 2
EN

Stack Overflow用户

发布于 2016-09-04 19:14:15

如果您的问题是一个没有*的数据项,那么像下面这样的表达式将返回整个字符串,结果是:

代码语言:javascript
复制
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)
    )
)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39320384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档