2015-01-07 28 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