2015-08-14 55 views
1

我正在使用我沒有文檔的第三方API。有一種方法需要一個SQL字符串並返回一個結果集。基於有效的SQL語法,我想確定SQL DBMS供應商,產品和版本。從方言SQL語法中識別DBMS?

語法像預期的那樣有效SELECT查詢的一部分的作品:

  • CASE WHEN 1 = 1 THEN 1 ELSE 0 END
  • CAST('Catatonic' AS CHAR(3))
  • GETDATE()
  • CONVERT(VARCHAR(10), GETDATE(), 101))
  • SELECT TOP 1 valid_column FROM ValidTable

語法,導致語法錯誤:

  • COALESCE(NULL, 'Dog')
  • ISNULL(NULL, 'Dog')
  • CURRENT_TIMESTAMP
  • SELECT @@VERSION
  • SELECT version()
  • 發言;終止(儘管這可能是一個API的東西)

要嘗試的任何其他SQL語法?

+1

不能用於nitpicky sql語法,只需在系統上拋出'big'dbms版本化查詢,就像'select @@ version',例如mysql:'select version()'。如果你打算在db上拋出隨機查詢,並期望它們中的大部分失敗,那麼至少會拋出有用的查詢來直接回答問題。 –

+0

CONVERT函數和SELECT TOP 1符號很有趣 - 不完全標準。 COALESCE是標準SQL(如ISO 9075); ISNULL是非標準的但常見的。 CURRENT_TIMESTAMP是標準SQL。 @@ VERSION強烈地表示 - 我相信MS SQL Server和Sybase使用這種表示法,我不知道其他使用它的系統(這與其他系統不一樣)。 –

+0

這是一個很難......你不能問第三方客戶支持嗎?第一個列表中的所有內容都可以與任何支持的sql server版本一起使用,也可以在第二個列表中的所有內容中使用 –

回答

1

我的答案,試圖給你的測試和評論上:

告訴第三方託管API,以及你的老闆和/或客戶,你不能與API的工作,沒有文檔,並且您必須得到API供應商的進一步支持纔能有效地執行您的工作。

如果文檔中提到「符合ANSI SQL標準」,那顯然是不正確的,因爲您的測試包括似乎建議SQL Server的各種(精心設計的)實例,但顯然不支持SQL服務器本身將允許。

因此,第三方顯然是過濾,重新解析或以其他方式修改您提供給它的SQL,並且沒有關於該圖層是什麼以及它做了什麼/不做什麼的進一步信息,那麼您就是手或多或少地被捆綁在一起,而你僅限於猜測和反覆試驗。

+0

第三方對我對信息的請求沒有很好的響應,特別是那些具體的事情,只有少數開發者會知道。我猜想這個信息會是'公司機密',但是值得一試,我想! – petemoloy

+0

如果您是客戶,並且他們正在公開API供您使用,則他們有義務爲您提供足夠的信息(文檔)以正確使用API​​!當然,並不是所有的供應商都是優秀的供應商,但這是我會採取的路線。 – SlimsGhost