簡體   English   中英

訪問查詢與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

我收到的錯誤是

“將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM