Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用Left和char索引返回的参数无效_Sql_Sql Server - Fatal编程技术网

Sql 使用Left和char索引返回的参数无效

Sql 使用Left和char索引返回的参数无效,sql,sql-server,Sql,Sql Server,当我组合left和charindex时,我得到的left参数无效 我的行返回类似productname、productupc或其他文本的内容 我只想获得产品名称 因此,通过使用charindex,我可以得到第一个逗号之前的总字符数 使用charindex(“,”,[列名]) 范例 [productinformation]用于列名 这是返回的完整列 select [productinformation] from testTable 蓝色小部件,1313138300件装在一个盒子里 sele

当我组合left和charindex时,我得到的left参数无效

我的行返回类似productname、productupc或其他文本的内容 我只想获得产品名称

因此,通过使用charindex,我可以得到第一个逗号之前的总字符数

使用charindex(“,”,[列名])

范例

[productinformation]用于列名

这是返回的完整列

 select [productinformation] from testTable
蓝色小部件,1313138300件装在一个盒子里

 select charindex(',',[productinformation]) from testTable
将返回12

使用 从testTable中选择left([productinformation])、charindex('、'、[productinformation])

返回

 blue widget,
 Invalid length parameter passed to the LEFT or SUBSTRING function
使用 从testTable中选择charindex(','[productinformation])-1 返回11

所以我假设从charindex中减去一个,就得到了产品名称

 SELECT  left([productinformation],charindex(','[productinformation])-1) FROM testTable
返回

 blue widget,
 Invalid length parameter passed to the LEFT or SUBSTRING function
函数只接收正整数

整数表达式 是一个正整数,指定返回字符\表达式的字符数。如果整数_表达式为负数,则返回错误。如果整型_表达式的类型为bigint且包含大值,则字符_表达式必须为大数据类型,如varchar(max)

因此,如果您的
CHARINDEDX()
没有找到该字符,它将返回
0
,并且您添加
-1
,因此
0-1
-1

那将抛出一个错误

传递给LEFT或SUBSTRING函数的长度参数无效

您需要检查返回值是否为正值

SELECT LEFT([productinformation],
            CASE WHEN CHARINDEX(',',[productinformation]) > 1
                 THEN CHARINDEX(',',[productinformation]) - 1
                 WHEN CHARINDEX(',',[productinformation]) = 1
                 THEN 1
                 ELSE LEN([productinformation]) --if you want to return it all otherwise 0
                 -- if you set it to 0 it will return ''
            END
           )
FROM testTable
函数只接收正整数

整数表达式 是一个正整数,指定返回字符\表达式的字符数。如果整数_表达式为负数,则返回错误。如果整型_表达式的类型为bigint且包含大值,则字符_表达式必须为大数据类型,如varchar(max)

因此,如果您的
CHARINDEDX()
没有找到该字符,它将返回
0
,并且您添加
-1
,因此
0-1
-1

那将抛出一个错误

传递给LEFT或SUBSTRING函数的长度参数无效

您需要检查返回值是否为正值

SELECT LEFT([productinformation],
            CASE WHEN CHARINDEX(',',[productinformation]) > 1
                 THEN CHARINDEX(',',[productinformation]) - 1
                 WHEN CHARINDEX(',',[productinformation]) = 1
                 THEN 1
                 ELSE LEN([productinformation]) --if you want to return it all otherwise 0
                 -- if you set it to 0 it will return ''
            END
           )
FROM testTable

如果未找到参数,
CHARINDEX
将返回0,因此
LEFT
函数将被赋予负值(当0减去1时),这就是导致无效长度错误的原因。您可以使用
CASE..WHEN
语句来避免这种情况

SELECT LEFT([PRODUCTINFORMATION],
CASE WHEN CHARINDEX(',', [PRODUCTINFORMATION]) = 0 THEN LEN([PRODUCTINFORMATION]) ELSE
CHARINDEX(',', [PRODUCTINFORMATION]) - 1 END) AS PRODUCTINFORMATION
FROM TESTTABLE

如果未找到参数,
CHARINDEX
将返回0,因此
LEFT
函数将被赋予负值(当0减去1时),这就是导致无效长度错误的原因。您可以使用
CASE..WHEN
语句来避免这种情况

SELECT LEFT([PRODUCTINFORMATION],
CASE WHEN CHARINDEX(',', [PRODUCTINFORMATION]) = 0 THEN LEN([PRODUCTINFORMATION]) ELSE
CHARINDEX(',', [PRODUCTINFORMATION]) - 1 END) AS PRODUCTINFORMATION
FROM TESTTABLE
你可以试试子串

SELECT 
SUBSTRING([productinformation], 0, CHARINDEX(',', [productinformation])) FROM testTable
你可以试试子串

SELECT 
SUBSTRING([productinformation], 0, CHARINDEX(',', [productinformation])) FROM testTable

0减1等于多少
select left('不相关的文本',charindex(',','不包含逗号的文本值')-1)
charindex(','[productinformation])中缺少的逗号。只是您问题中的一个输入错误吗?0减去1是什么
select left('不相关的文本',charindex(',','不包含逗号的文本值')-1)
charindex(','[productinformation])中缺少的逗号。
只是您问题中的一个输入错误?如果您在case语句的else子句中添加-1,这是正确的。感谢您捕捉到@jyao,我更新了我的帖子以省略输入错误。如果CHARINDEX()返回0怎么办?在您的代码中,它的意思是1-1=0,这将给出错误的结果,因为该字符存在。@Sami如果CHARINDEX返回0,则代码将在CASE语句的第一个条件下退出,该条件将对此进行检查,并且只使用列的长度而不减去1。无法访问后续的ELSE。如果在case语句的ELSE子句中添加-1,这是正确的。感谢您捕捉到@jyao,我更新了我的帖子以省略输入错误。如果CHARINDEX()返回0怎么办?在您的代码中,它的意思是1-1=0,这将给出错误的结果,因为该字符存在。@Sami如果CHARINDEX返回0,则代码将在CASE语句的第一个条件下退出,该条件将对此进行检查,并且只使用列的长度而不减去1。后续的ELSE将无法到达。您只需指出错误的原因,但如果您同时提供解决方案会更好。您只需指出错误的原因,但如果您同时提供解决方案会更好。