2013-06-25 77 views
0

我有一個Access 2000查詢適用於SQL Server 2008 R2的鏈接表。我需要把它寫成一個視圖或通過查詢:1000000,與OODD%,但不開始下subquery or passthrough; SQL Server 2008r2

`

SELECT Max(CLng((Mid([tbl1]![ID],5)))) AS lastnumberused 
FROM [tbl1] 
WHERE ((([tbl1]![ID]) Like "OODD*" And ([tbl1]![ID]) Not Like "OODDid*" And ([tbl1]![ID]) Not Like "*x") AND ((CLng((Mid([tbl1]![ID],5))))<1000000)); 

`

所以,我正在尋找的是最大號OODDID%。記錄也不能以'x'結尾。

我的TSQL代碼爲SQL Server看起來像這樣並不起作用......

`

SELECT  
convert (int, (substring(tblMain.BarcodeID,5,10))) as X1, [ID] 
FROM tblMain 
WHERE ([tbl1]![ID] LIKE N'OODD%') 
AND ([tbl1]![ID] NOT LIKE N'%x%') 
AND ([tbl1]![ID] NOT LIKE N'OODDID%') 
Select MAX (x1)+1 
from bar1 
where (x1<1000000) 

`

建議? 感謝,H

更新15june2013 WITH T1 (number) AS (SELECT substring(tbl1.ID,5,10) FROM tblMain AS tbl1 WHERE (ID LIKE N'oodd%') AND (ID NOT LIKE N'%x%') AND (ID NOT LIKE N'ooddID%')) SELECT (cast((number)as int)) FROM T1 這工作,並返回561770行。

With T1(number) as(SELECT cast(SUBSTRING(ID, 5, 7)as int) FROM tblMain as tbl1 WHERE (tbl1.ID LIKE N'oodd%') AND (tbl1.ID NOT LIKE N'%x%') AND (tbl1.ID NOT LIKE N'%ooddID%') AND ISNUMERIC(SUBSTRING(tbl1.ID,5,10))=1) Select max(number) from T1 同樣的工作,但返回上述百萬

一些當一個where語句添加以下代碼包含應被排除在前面的語句記錄。 With T1(number) as(SELECT cast(SUBSTRING(ID, 5, 7)as int) FROM tblMain as tbl1 WHERE (tbl1.ID LIKE N'oodd%') AND (tbl1.ID NOT LIKE N'%x%') AND (tbl1.ID NOT LIKE N'%ooddID%') AND ISNUMERIC(SUBSTRING(tbl1.ID,5,10))=1) Select max(number) from T1 where x1 <1000000

回答

2

WHERE子句包含一個不存在於FROM子句中的[tbl1]表。您應該將其更改爲tblMainBee,或者使用AS在FROM子句中添加「tbl1」別名。

此外,你有兩個不連接的SELECT語句,而不是一個單一的。再次,在第二個SELECT中,有一個bar1表,它不會出現在其他地方......它是正確的嗎?

另一個錯誤是你不能使用「!」分隔表名和字段名。你必須使用一個點。

最後,嘗試轉換數據類型時出現問題。你不需要它,因爲字符串之間的比較也可以。

您的訪問SELECT語句更直接。

嘗試用

WITH T1(number) AS (

SELECT substring(tbl1.ID,5,LEN(tbl1.ID)-4) 
FROM tblMainBee as tbl1 
WHERE ([tbl1].[ID] LIKE N'OODD%') 
    AND ([tbl1].[ID] NOT LIKE N'%x%') 
    AND ([tbl1].[ID] NOT LIKE N'OODDID%') 
    AND (IsNumeric(substring(tbl1.ID,5,LEN(tbl1.ID)-4)) = 1) 
) 
SELECT max(convert(bigint,number)) FROM T1 WHERE number < 1000000; 

第二種類型轉換是隱含的,因爲百萬是數字。第一個是必要的。否則,它會認爲'12346'大於'123421'。

字符串之間的比較只有在具有固定長度時纔有效。

問候,

+0

Clon-謝謝。此代碼正在運行,您發現我在原始帖子中犯的錯誤是正確的。我試圖隱藏表格和字段名稱。雖然這個工作沒有錯誤,但它仍然沒有給出我的Access前端正在給予的正確答案。再次謝謝 - 我將在稍後的日期發佈工作代碼/ – Hikerd

+0

Hikerd--你能告訴我你得到的答案與正確答案嗎?另外,ID字段內容中是否有任何一致的結構?這可能會有所幫助。 – Clon

+0

另外,您應該更改子字符串函數(5和10)的參數以滿足您的要求。我必須根據給定的信息來猜測它們。 – Clon

1

試試這個

select MAX(CAST(SUBSTRING(ID,5,9) as INT))+1 
from tblMainBee 
where 
    ID Like 'OODD%' 
    AND ID Not Like 'OODDid%' 
    AND ID Not Like '%x' 
    AND ISNUMERIC(SUBSTRING(ID,5,9))=1 
    AND CAST(SUBSTRING(ID,5,9) as INT)<1000000 
+0

亞歷山大。感謝代碼。這仍然返回以前的錯誤。 「將nvarchar值'188540x'轉換爲數據類型int時轉換失敗。」我目前正在研究Mods Clon的答案。由於具有ISNUMERIC功能,因此可以使用 – Hikerd

+0

+1。爲了更安全起見,我只更換SUBSTRING(ID,5,LEN(ID)-4)的SUBSTRING(ID,5,9)。 – Clon