bestlong 怕失憶筆記

當健忘由隨機逐漸趨向常態時,作筆記是非常必要的

Entries Tagged ‘MSSQL’

無法解析 equal to 動作的定序衝突

這是在預儲程序後執行時所回應的錯誤訊息,程式碼節錄部份如下:

1
2
3
4
5
6
7
CREATE TABLE #tbMain(id INT IDENTITY(1,1), Line VARCHAR(20) NOT NULL, Part_num VARCHAR(9) NOT NULL, Lv INT)

INSERT INTO #tbMain(Line,Part_num,Lv)
SELECT Replicate('.',@L) + LTrim(str(@L)), B.Part_num, @L+1
FROM BOM B, #tbMain M
WHERE B.Asmb_num = M.Part_num
  AND M.Lv = @L

為什麼呢?
一般繁體中文版 MSSQL 建置時多數人都會用預設定序 Chinese_Taiwan_Stroke_CI_AS
但是其中一個資料庫是從別的環境附加進來的,該資料庫定序是用 Chinese_Taiwan_Stroke_BIN
一般來說,在同一個資料庫中的資料表的定序都會使用資料庫預設值
此問題常發生於處理兩個資料庫的資料表進行 JOIN 關聯之時
而建立臨時表 #tbMain 會使用 TempDB 資料庫的空間與定序
而 TempDB 資料庫的定序使用伺服器的定序設定
所以當 JOIN 這兩個不同定序的資料表時,字串欄位就無法進行比對而回應錯誤

可以將程式碼中的

1
WHERE B.Asmb_num = M.Part_num

改成

1
WHERE B.Asmb_num COLLATE Chinese_Taiwan_Stroke_BIN = M.Part_num COLLATE Chinese_Taiwan_Stroke_BIN

強制轉換成為相同定序後就可以正常執行了

另外因為本狀況是使用臨時表,所以也可以在建立時就指定欄位定序

1
2
3
4
5
CREATE TABLE #tbMain(
id INT IDENTITY(1,1),
Line VARCHAR(20) COLLATE Chinese_Taiwan_Stroke_BIN NOT NULL,
Part_num VARCHAR(9) COLLATE Chinese_Taiwan_Stroke_BIN NOT NULL,
Lv INT)

這樣就不必在每個 JOIN 指令中強制轉換定序
不過最好還是將資料庫轉換成與伺服器相同的定序

Leave a Comment

如何識別 MS SQL Server 的版本

工作上接觸過的 SQL Server 版本很多,從古老的 6.5 版到 2005 的都有。
伺服器更新到那一個 Service Pack 也無法直接獲得資訊,只能下SQL或使用管理介面先取得版本編號後再透過查表方式確認。
詳細資料可參考微軟知識庫文章:
http://support.microsoft.com/kb/321185/zh-tw

Leave a Comment

MSDE 2000 管理筆記

SQL Server Desktop Engine (MSDE) 2000

連線至 Microsoft 桌面引擎
http://support.microsoft.com/kb/319930/ZH-TW/

使用 Osql 公用程式管理 SQL Server Desktop Engine (MSDE 2000)
http://support.microsoft.com/kb/325003/ZH-TW/

如何藉由使用 Transact – SQL 備份 Microsoft Data Engine 資料庫
http://support.microsoft.com/kb/241397/ZH-TW/

Leave a Comment

資料庫管理工具 DbaMgr – DbaMgr2K

開發資料庫程式使用 MSDE 2000 資料庫卻沒有管理工具,可以使用此工具

A little alternative administrative console for Microsoft MSDE 1.0 and MSDE 2000 written in Microsoft Visual Basic 6.0




DbaMgr requires Ado2.5 (MDAC2.5) and portion of SQL Server 7.0 Client Components containing SQL-DMO;
DbaMgr2k requires Ado2.6 (MDAC2.6) and portion of SQL Server 2000 Client Components containing SQL-DMO.

SQL Server 7.0 installations require DbaMgr, that can not connect to SQL Server 2000.
On the contrary, SQL Server 2000 installations require DbaMgr2k, that can not connect to SQL Server 7.0.

http://www.asql.biz/en/DbaMgr.aspx

Leave a Comment

使用 jTDS 連接 MSSQL

在 iReport 中連接 MS SQL Server 資料庫可以使用 jTDS
而 jTDS-1.2.2 的預設屬性是支援 8.0 也就是一般稱為 2000 的 SQL Server
一般會設定 JDBC URL 如下

jdbc:jtds:sqlserver://ServerAddress/DBName;instance=

當需要連接 7.0 或是 6.5 等先前版本的 SQL Server 時就會出現下列錯誤訊息

1
2
3
4
5
6
7
Message:
    java.sql.SQLException: I/O Error: Stream 0 attempting to read when no request has been sent
Level:
    SEVERE
Stack Trace:
    net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2307)
...之後省略

這時只要在 JDBC URL 中增加屬性調整 TDS

連接 SQL 7.0

jdbc:jtds:sqlserver://ServerAddress/DBName;instance=;TDS=5.0

連接 SQL 6.5

jdbc:jtds:sqlserver://ServerAddress/DBName;instance=;TDS=4.2

但基本上只有連線到 SQL 6.5 才需要指定,若是連接到 SQL 7.0 時 jTDS 會自動偵測調整。

詳細資料可以參考 jTDS 官方FAQ文件 http://jtds.sourceforge.net/faq.html

Comments (2)

  • 工商服務

    廣告讀取中...
  • 近期迴響

  • 標籤

  • 彙整