先發一些我平時遇到的問題和筆記,希望能對各位有幫助。先發3個條目,太長了也不好,看效果如何?或者有什么建議,可以提出來,后續就可采納。錯誤之處,請見諒并指正。謝謝!
1、
一些常見的SQL效能調整;
2、由存儲過程(StoredProcedure)引發的 "无法解决 equal to 操作的排序规则冲突。"
StoredProcedure中使用了暫存#TempTable
Ex:
Create Table #TempTable
(Field01 varchar(10),
Field02 varchar(20))
以上在繁體SQLServer中Field1 & Field2預設的COLLATE為Chinese_Taiwan_Stroke_CI_AS
在簡體SQLServer中Field1 & Field2預設的COLLATE則為Chinese_PRC_CI_AS
(這是因為暫存#TempTable預設的COLLATE為系統tempdb的COLLATE的關係,
且tempdb為系統數據庫,不允許使用Alter DataBase去變更COLLATE)
而於繁體數據庫中,所有的Table中char / varchar預設皆為Chinese_Taiwan_Stroke_CI_AS
如此只要Join了不同COLLATE的Field,
就會引發錯訊 "无法解决 equal to 操作的排序规则冲突。"
要解決上述的問題有以下3種方式:
1)、 於Create Table #TempTable時,註明每個Field的COLLATE…
Ex:
Create Table #TempTable
(Field01 varchar(10) COLLATE database_default,
Field02 varchar(20) COLLATE database_default)
以上char / varchar皆註明COLLATE database_default,其中database_default的意義為
告訴SQLServer說,這個#TempTable的COLLATE請參照目前連結的DB,而不要去參照tempdb
或
Create Table #TempTable
(Field01 varchar(10) COLLATE Chinese_Taiwan_Stroke_CI_AS,
Field02 varchar(20) COLLATE Chinese_Taiwan_Stroke_CI_AS)
以上char / varchar皆註明特定的COLLATE,以確保 #TempTable的COLLATE
和我們DB中Table的COLLATE保持一致,而不要再去參照tempdb
2)、 在Join實體Table與#TempTable時註明COLLATE為何
Ex:
Select * From Table1 t1, #TempTable t2
Where t1.Field01 = t2.Field01
Collate Chinese_Taiwan_Stroke_CI_AS -- 在Select的最後註明要使用的COLLATE為何
3)、 繁體的SQLServer使用繁體的DB / 簡體的SQLServer使用簡體的DB,
不要交叉互相使用,也就是在SQLServer中固定使用與該SQLServer預設相同COLLATE的Table,也就是
在繁體的SQLServer中Create繁體用的DB後,再Create Table & Field,
如此預設所有Field的COLLATE就會是Chinese_Taiwan_Stroke_CI_AS
而在簡體的SQLServer中Create簡體用的DB後,再Create Table & Field,
如此預設所有Field的COLLATE就會是Chinese_PRC_CI_AS
3、“...WHILE ATTEMPTING TO OPEN OR CREATE...”,數據庫創建失敗問題
用程式創建一個sql server 資料庫時,出現了“...WHILE ATTEMPTING TO OPEN OR CREATE...”,資料庫創建失敗。看起來是沒有權限的關系。但是在studio里面是可以創建的。
後來查找sql configuration management (組態管理員),發現sql server 及sql agent登入身份都是networt service。據查資料,若系統服務netlogon沒有啟動的話,那么sql以這種身份登入,權限是無法被識別的。或是獨立型的服務器,采用這種方式登錄也不行。
解決方式是把登入身份改為本地帳戶(透過組態管理員)