[英]Access query vs SQL Server 2008 query
我试图将此查询从Access数据库转换为可在SQL Server 2008中工作并卡住。 我知道有差异,但是我不确定发生了什么,显然我不太擅长此事。 任何帮助,将不胜感激。
访问
Mid(Trim([SC01039]),
InStrRev(Trim([SC01039])," ")+3,4)
AS ProductType
SQL Server 2008 (这是我尝试将其更改为的内容)
Substring(RTrim(LTrim([SC01039])),
Right(RTrim(LTrim([SC01039])),
CHARINDEX(' ',RTrim(LTrim([SC01039]))))+3,4)
AS ProductType
我收到的错误是
“将nvarchar值'L318'转换为数据类型int时转换失败。”
为什么要尝试将结果文本转换为整数? 我的假设是查询的意思是:“找到最靠近字符串右边的空间的位置,现在在该位置加3,然后给我接下来的4个字符。” 似乎是数据问题,而不是查询问题(如果没有空间,怎么办?或者字符串为null?),我不知道...
我什至没有接近? :P
SC01039中包含混合字符,但这是一个示例:
SC01039 : Expected Output
------------- : ---------------
QC 06999911 : 9999
SW 12FMT116 : FMT1
26RMF399 : RMF3
08 : [empty]
[empty] : [empty]
显然,它始终是4个字符,从找到的第一个空格的右边开始3个字符(从右到左搜索空格)。 SC01039中的某些数据具有多个空格(例如:09 TVR 012 2,在这种情况下,它不返回任何内容,我相信可以)。
您的问题出在代码的一部分Right(RTrim(LTrim([SC01039])),
。为什么需要它呢?因为下面显示的内容可以解决这个问题。
尝试这个:
Substring(RTrim(LTrim([SC01039])),
CHARINDEX(' ',RTrim(LTrim([SC01039])))+3,4)
AS ProductType
子字符串期望SUBSTRING(expression, start, length)
并且您为第二个参数提供了nvarchar。
Right(RTrim(LTrim([SC01039])),
CHARINDEX(' ',RTrim(LTrim([SC01039]))))+3
因此你的错误。
创建此功能(您不必放置它有助于提高可读性
CREATE FUNCTION InStrRev(@Val nvarchar(max), @substr nvarchar(max))
RETURNS int
AS
BEGIN
RETURN CASE WHEN CHARINDEX(@substr, RTrim(LTrim(Reverse(@Val)))) = 0 THEN 0 ELSE LEN(@Val) - CHARINDEX(@substr, RTrim(LTrim(Reverse(@Val)))) + 1 END -- add one because you want a start position
END
并在这样的代码中使用它
Substring(RTrim(LTrim([SC01039])), dbo.InStrRev([SC01039], ' ') + 3, 4) AS ProductType
希望能帮助到你
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.