2011年9月15日 星期四

列出目前資料庫裡,欄位定序與資料庫定序不同的所有欄位

訊息468,層級16,狀態9,行1
無法解析equal to 作業中"Chinese_Taiwan_Stroke_CI_AS" "Chinese_Taiwan_Stroke_90_CI_AS" 之間的定序衝突。

  近一個月內就讓我遇到兩次上面這個錯誤,上一次是跨Server的,這一次則是發生在同一個DB內的,想說寫一個簡單的語法來找出定序不同的地方囉

--列出目前資料庫裡,欄位定序與資料庫定序不同的所有欄位
SELECT t.name [資料表名稱] ,c.name [欄位名稱],c.collation_name [定序],DATABASEPROPERTYEX(DB_NAME(),'collation') [目前資料庫定序]
FROM sys.tables t INNER JOIN sys.columns c
ON t.object_id = c.object_id AND c.collation_name <> CONVERT(NVARCHAR(128),DATABASEPROPERTYEX(DB_NAME(),'collation'))

--列出資料庫裡中設為某個定序的所有欄位
SELECT
t.name [資料表名稱] ,c.name [欄位名稱],c.collation_name [定序]
FROM sys.tables t INNER JOIN sys.columns c
ON t.object_id = c.object_id AND c.collation_name = 'Chinese_Taiwan_Stroke_CI_AS'

  找到之後若欄位可以改定序就用下列語法將欄位定序換掉
ALTER TABLE TableA ALTER COLUMN Column1 VARCHAR(12) COLLATE Chinese_Taiwan_Stroke_90_CI_AS


  若不能改定序,其實也只要在那出錯的語法後面指定要使用的定序即可
SELECT * FROM tableA a
WHERE EXISTS (SELECT * FROM tableB b WHERE a.Id = b.Id collate Chinese_Taiwan_Stroke_90_CI_AS)

0 意見:

張貼留言