访问查询与 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

我收到的错误是

"Conversion failed when converting the nvarchar value 'L318' to data type int."

为什么要尝试将生成的文本转换为整数?我的假设是查询是说,"Find the position of the space closest to the right of the string, now add 3 to that position and give me the next 4 characters." 这似乎是数据的问题,而不是查询(如果没有 space,它会做什么?或者字符串为空?)我不知道...

我什至接近了吗? :P

SC01039 中有混合字符,但这是示例:

SC01039         :     Expected Output
-------------   :     ---------------
QC   06999911   :     9999
SW   12FMT116   :     FMT1
26RMF399        :     RMF3
08              :     [empty]
[empty]         :     [empty]

显然它总是 4 个字符,从找到的第一个 space 的右侧开始第 3 个字符(从右到左搜索 space)。 SC01039 中的一些数据有多个 space(即:09 TVR 012 2,在这种情况下它没有 return 任何东西,我相信这没问题)。

您的问题出在代码的 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

希望对您有所帮助