2015-01-07 186 views
0

我试图将此查询从Access数据库转换为在SQL Server 2008中工作,并陷入困境。我知道存在差异,但我不确定发生了什么,显然我不擅长这一点。 任何帮助,将不胜感激。访问查询与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,在这种情况下,它不返回任何内容,我相信这是可以的)。

+0

显示数据。目前在'SC01039'列'Charindex'部分出了问题 –

+0

感谢您的帮助;) –

回答

0

你的问题是你的代码的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 

希望它可以帮助

+0

感谢您的帮助。这让我越过了错误,因为我不明白我在做什么。然而,需要的“RIGHT”函数从字符串的右侧(端部)搜索第一“”(空格)的位置。我尝试了这个并且非常接近我需要的: '子字符串( RTrim(LTrim([SC01039])), CHARINDEX('',Reverse(RTrim(LTrim([SC01039])))) - 1, 4) AS ProductType' –

+0

从右到左在字符串中查找字符的正确方法是什么?我最初的想法是“正确”,但现在我看到它返回一个字符串,所以我搜索了一下,发现“Reverse”作为从右到左搜索空间位置的可能解决方案。这可以接受吗?再次感谢。 –

+0

我修改了我的答案。 – Jaques