繁体   English   中英

访问查询与SQL Server 2008查询

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM