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