2013-11-21 48 views
0

我有我轉換成SQL下面的VBA代碼...在SQL中使用頂部1,而不是循環

 Do While Not sRst1.EOF 
      sRst1.MoveLast 
      sRst1.MoveFirst 

      If (sRst1!Field1 = "FileName") Then 
       Exit Do 
      End If 
      sCtr = sCtr + 1 
      sRst1.MoveNext 
     Loop 

所以基本上我需要抓住的第一條記錄,其中字段1等於文件名,其中如果我沒有弄錯,我可以通過選擇TOP(1)where field1 =「FileName」來完成。另外,我需要返回記錄到達該記錄所需的記錄數。我怎麼能這樣做?

+2

要計算您需要的行數,直到找到第一個匹配爲止,這取決於您遍歷行的順序。如果您沒有明確設置,SQL不保證任何特定的順序。你想要以哪種順序遍歷行? – FrankPl

+0

實際上從來沒有在原始應用程序中指定的順序,記錄集在臨時表中打開,然後光標移動到第一條記錄。 – codingManiac

+0

所以,你只是幸運的,如果你在幾次調用中使用這個方法得到相同的號碼。或者,也許遊標使用了「ORDER BY」? – FrankPl

回答

1
WITH t AS (SELECT *,ROW_NUMBER() OVER(ORDER BY (SELECT 0)) row_num FROM sRst1) 
SELECT field1,row_num FROM t WHERE field1 = 'FileName' 

由於FrankPl指出,ROW_NUM將是隨機的,如果你不告訴SQL你想要什麼樣的順序。將「(SELECT 0)」替換爲「field1」或其他一列以解決此問題。

+0

當數據插入到表中時,必須有MS Access中的本機順序,如果不是,那麼我想我只是將訂單留出,應用程序不是由我設計的,所以我不能說他們想要做什麼。 – codingManiac

+0

SQL Server!= MS Access – Anon