2015-10-06 44 views
2

工作,我需要遷移從MS SQL的舊程序通過ODBC的SQLite。我沒有源代碼。它在編寫數據時工作得很好,但是一些帶有TOP子句的SELECT不起作用。從可執行文件查詢字符串是:如何從查詢中刪除MS SQL TOP子句,使其在SQLite的

SELECT TOP %ld [%s] FROM [%s] WHERE ([%s] < %f) 

查詢是針對單個字段。我需要刪除「TOP%ld」部分,但保留結果。正確的查詢是這樣的:

SELECT "%s" FROM "%s" WHERE ("%s" < %f) 

此字符串傳遞給sprintf的或類似的C函數,所以我需要LD%作爲第一個參數,但結果應該是一樣的第一個查詢。

有沒有辦法讓LD%沒有量變到質變的結果,而改變從MS SQL數據庫對於SQLite?

編輯1:這是一個32位Windows應用程序。

編輯2: 如果我使用下一個字符串:

SELECT "%.*s" FROM "%s" WHERE ("%s" < %f) 

我可以得到非常接近的結果,但我失去了請求的行數。另外,如果第一個參數小於列名稱的字符數,則會有SQL異常。

EDIT 3: Aloso可能:

SELECT (%ld * 0) + "%s" FROM "%s" WHERE ("%s" < %f) 

它要求該列是數字型這是通常的情況。編輯2的例外情況可以避免。

+1

如果您的應用程序沒有源代碼,您可以更改哪些內容? – jpw

+0

謝謝!非常有幫助。我需要改變我上面寫的內容。 –

回答

0

只需使用一個註釋:

SELECT /*%ld*/ [%s] FROM [%s] WHERE ([%s] < %f) 

使用SQLite 3.8.3或更高版本,可以使用common table expression拿到第一值到LIMIT子句:

WITH L(x) AS (SELECT %ld) 
SELECT [%s] FROM [%s] WHERE [%s] < %f LIMIT (SELECT x FROM L); 
+0

第二個看起來很有希望。謝謝。第一個錯誤是因爲printf參數(請參閱編輯或Crozin的回​​答)。 –

+0

第一個參數與原始查詢中的參數相同。 –

+0

對不起,我的錯。它在SQLite中的註釋不在C中,它仍然存在。 –

0

如果您printf般的功能支持屬性的排序,你可以很容易地更改查詢。

printf("1 = %2$d, 2 = %1$d", 1, 2); // prints "1 = 2, 2 = 1" 

所以你可以試試:

SELECT %2$s FROM %3$s WHERE (%4$s < %5$f) LIMIT %1$ld 
+0

我不確定。 2005年之前的VC支持訂購嗎? –

+0

我不相信程序員使用'printf_p'。但是我會在任何情況下檢查。 Visual C++ 2005支持它。 –

+0

好吧..如果您無法訪問源代碼,最簡單的方法是簡單地檢查在替換SQL時會發生什麼。 ;-) – Crozin