2011-12-13 35 views
26

Có tập lệnh nào tôi có thể sử dụng để tìm tất cả các cột trong tất cả các bảng trong danh mục SQL không có collation <database default> không?Tìm đối chiếu không mặc định trên cột cho tất cả các bảng trong SQL Server

Tôi đã thực hiện trên một hệ thống cũ và có các collations khác nhau trong một số bảng và tôi muốn tìm tất cả các trường hợp trong một lần truy cập thay vì thực hiện thủ công.

Tuy nhiên, tôi không muốn thay đổi đối chiếu theo chương trình vì tôi muốn xem từng bảng một.

enter image description here

Trả lời

64

Hãy thử kịch bản này ở đây:

DECLARE @DatabaseCollation VARCHAR(100) 

SELECT 
    @DatabaseCollation = collation_name 
FROM 
    sys.databases 
WHERE 
    database_id = DB_ID() 

SELECT 
    @DatabaseCollation 'Default database collation' 

SELECT 
    t.Name 'Table Name', 
    c.name 'Col Name', 
    ty.name 'Type Name', 
    c.max_length, 
    c.collation_name, 
    c.is_nullable 
FROM 
    sys.columns c 
INNER JOIN 
    sys.tables t ON c.object_id = t.object_id 
INNER JOIN 
    sys.types ty ON c.system_type_id = ty.system_type_id  
WHERE 
    t.is_ms_shipped = 0 
    AND 
    c.collation_name <> @DatabaseCollation 

Nó kiểm tra các cơ sở dữ liệu đối chiếu mặc định và sau đó tìm thấy bất kỳ cột không tuân thủ với điều đó.

+1

Phát hiện, cảm ơn rất nhiều. Sẽ chấp nhận điều này như là câu trả lời ngay sau khi "5 phút" là lên! – Rippo

+0

Cảm ơn, đã cứu tôi rất nhiều thời gian :) – Pking

+0

Câu trả lời hay, tôi nghĩ có một lỗi nhỏ. Tham gia trên system_type_id có thể tạo các kết quả trùng lặp nếu cơ sở dữ liệu có các kiểu tùy chỉnh. Tôi nghĩ rằng việc tham gia thực sự nên được trên user_type_id. – PeteT

Các vấn đề liên quan