访问查询与SQL Server 2008查询

时间:2015-01-07 05:54:48

标签: sql sql-server sql-server-2008 ms-access

我正在尝试将此查询从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个字符。”这似乎是数据的问题,而不是查询(如果没有空格它会怎么做?或者字符串是空的?)我不知道......

我接近了吗? :P

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

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

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

1 个答案:

答案 0 :(得分:0)

问题在于代码的Right(RTrim(LTrim([SC01039])),部分。你为什么需要它?因为我在下面展示的应该可以解决问题。

试试这个:

Substring(RTrim(LTrim([SC01039])),
CHARINDEX(' ',RTrim(LTrim([SC01039])))+3,4) 
AS ProductType

Substring期待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

希望有所帮助