2013-06-27 57 views
1

我在SQL Server 2008R2(10.5)中使用ODBC驅動程序的Microsoft OLE DB提供程序連接到Informix(Atomix)數據庫中的鏈接服務器設置(它實際上指向DSN使用ODBC驅動程序)。通過這個,我可以插入記錄,只要我插入的記錄不會嘗試插入日期值。不要緊,我周圍的日期值,也不是SQL語法我嘗試用分隔符 - 看到的例子:從SQL Server到Informix鏈接服務器的日期值

INSERT INTO [linkedinformix]...[tablename](daterequested) VALUES (2013-06-27) 

SELECT * FROM OPENQUERY(linkedinformix,'INSERT INTO tablename (daterequested) 
VALUES (2013-06-21)) 

上述會給語法錯誤或類型衝突錯誤(或在其他情況下,如果我不要運行提供程序,會導致SQL Server崩潰)。我試過在我傳遞的日期值周圍使用{},#,|和其他分隔符,並嘗試了不同的日期格式(2013年6月27日,等)。

如果我指出Microsoft Access在同一個DSN上創建一個鏈接表,我可以手動將日期寫入表中,所以我知道ODBC驅動程序可以處理它。

必須有一個簡單的答案...

+0

Informix DBDATE環境變量的值是什麼? –

回答

1

Informix和DATE類型—一個有趣(複雜)的話題。事實上,從Informix世界來看,它非常簡單;當其他系統涉及不同的觀點時,應該怎麼做纔會變得棘手。

如果一切都正確設置(例如,在我的環境),你可以在Informix世界寫:

INSERT INTO tablename(daterequested) VALUES('2013-07-03'); 

而且你可以代替單引號雙引號,因爲Informix的是鬆懈的區別,除非你握着它的手,說:「當我使用雙引號時,我想大聲喊叫」。

更精心,你也可以這樣寫:

INSERT INTO tablename(daterequested) VALUES(DATETIME(2013-07-03) YEAR TO DAY); 

這將工作,因爲(a)爲DATETIME格式固定在ISO 8601(日期/時間格式)或ISO 9075(SQL)格式( b)Informix將毫無疑問地從DATETIME YEAR TO DAY轉換爲DATE。這是可靠的,不像第一版本那樣依賴於任何環境變量設置或其他併發症。

你也可以可靠地寫入:

INSERT INTO tablename(daterequested) VALUES(MDY(7, 3, 2013)); 

這將使用功能MDY三個整數轉換爲一個日期;參數的順序是(記憶)月,日,年。這是可靠的,因爲它不依賴於環境變量。

第一個符號(使用字符串'2013-07-03')依賴於環境變量。經典變量是$DBDATE;我在環境中設置了DBDATE=y4md-,因此像'2013-07-03'這樣的字符串被解釋爲ISO 9075.但是,對於美式日期,DBDATE的默認值實際上是DBDATE=mdy4/。但是,還有其他一些變量,例如CLIENT_LOCALE,DB_LOCALE和GL_DATE都想要加入遊戲。我使用DBDATE是因爲它獲得最高優先級(並且從時間開始就已經完成),但是較新的(其他)變量有其優點。您還可以嘗試:

INSERT INTO tablename(daterequested) VALUES(DATE('07/03/2013')) 

注意引號和括號。該字符串根據環境變量進行解釋。不要嘗試DATE(2013-07-03),因爲那相當於DATE(2003)(2013減去7是2006; 2006 - 3是2003),因爲第1天是1900-01-01,2003年是1905-06-16,星期一。

SQL標準提供了DATE '2013-03-07',但Informix不支持無圓括號表示法。

您需要將SQL Server記法重新粘貼到SQL語法中,但MDY和DATETIME方法可以工作,並且如果您願意使用環境變量,則可以使DATE方法變爲可用狀態,或者修改日期字符串的格式以匹配預期的行爲。

+0

謝謝,但沒有一個在我的情況。我懷疑它是老版本的Informix(Noble Systems使用的Atomix)和/或專有的ODBC驅動程序,這是真正的問題(雖然MS Access可以在通過ODBC連接時以某種方式插入日期)。 – Daryl

+0

如果MDY()變體不起作用,我感到很驚訝。 DATETIME(...)YEAR TO DAY變體也應該起作用。對於那些失敗的人,驅動程序必須搞砸 - 即使不是故意破壞正在發送給Informix的SQL也是如此。任何涉及字符串文字的變體都可能是一個問題。也許你應該使用SET EXPLAIN ON來查看Informix服務器作爲要處理的SQL發送了什麼內容,但是如果你遇到語法錯誤(它只能解釋執行哪個),這可能沒有幫助。我確實有監視原始SQL對話的代碼;它不是微不足道的使用。 –

+0

謝謝。我將您的答案標記爲已接受,因爲它是相當明確的,儘管它在我的特定情況下不起作用(可能是因爲Atomix是較老的Informix的分支)。 – Daryl