項目需要這樣的轉換,發現有些視圖轉換後查詢死機,經過一番研究, 終於有點收獲:
原來的死機sql:(簡化過)
SELECT 產品ID,
(SELECT SUM(數量)
FROM dbo.nowlib nowlib
WHERE nowlib.產品ID = Product.產品ID) AS 現存數量, 預警上限, 預警下限,
(SELECT 預警上限 - SUM(數量)
FROM dbo.nowlib nowlib
WHERE nowlib.產品ID = Product.產品ID) AS 缺貨數量, 通用名, 輸入碼, 品名, 產地,
規格, 單位, 包裝, 劑型, 零售價, 批發價, 近期進價, 批准文號
FROM dbo.PRODUCT Product
GROUP BY 產品ID, 通用名, 輸入碼, 品名, 產地, 規格, 單位, 包裝, 劑型, 零售價, 批發價,
近期進價, 批准文號, 預警上限, 預警下限
ORDER BY 品名, 產地
上面的sql在sqlserver中完全正常,但是Access中修改過一點語法區別後仍死機,經過試驗發現第一個子查詢是正常的,第二個會出錯。研究後發現如果子查詢中出現了:預警上限,就會出錯,這是主表PRODUCT 中的字段,所以推論是如果子表出現主表的字段,就會出錯(where後面用於連接的id不算)。
修改後的sql語句可以正常了,像下面這樣(簡化過):
SELECT 產品ID, 預警上限, 預警下限, 通用名, 輸入碼, 品名, 產地, 規格, 單位, 包裝, 劑型, 零售價, 批發價, 近期進價, 批准文號,
(SELECT SUM(n3.數量) as tmp
FROM nowlib as n3
WHERE n3.產品ID = pro.產品ID) AS 總數量3, 預警上限-總數量3 AS 缺貨數量
FROM PRODUCT AS Pro
GROUP BY 產品ID, 通用名, 輸入碼, 品名, 產地, 規格, 單位, 包裝, 劑型, 零售價, 批發價, 近期進價, 批准文號, 預警上限, 預警下限
ORDER BY 品名, 產地;
-------------------------------------------------------------------------------------------------------------------------------------------
原來Access還有這樣一個‘特色’,寫出來給那些仍然正在郁悶中的人解脫一下。對了,網上找到一些資料,是關於SQL Server轉換為 Access時候需要注意的問題,一並列出:
-------------------------------------------------------------------------------------------------------------------------------------------
最近正在升級一個程序,使其支持多數據庫。
原來的程序數據庫為SQL Server,所以使用SQL Server 的“導入和導出數據”功能將一個 SQL Server 數據庫轉換成了Access數據庫,但其中發現了一些問題,但也找到了解決方案,一並記錄於此:
1、轉換程序會將SQL Server的視圖轉換成表,而不是Access的查詢;
2、在為字段設置默認值為空字符的時候,SQL Server用‘’(空單引號),而Access用“”(空雙引號);
3、Access中沒有GetDate()函數,應該使用Now()函數代替;
4、Access沒有SQL Server用來獲取客戶端機器名的host_name()函數;
5、Access中沒有Case When Then語句,