Lingdingyang

Stay Hunger, Stay Foolish

Want to be a generalist, able to take on a wide variety of different work.


Get database default collation

Find non default collation on columns for all tables in SQL Server

问题背景

因为测试环境下有数个历史项目的数据库在某服务器上,现在重构某历史遗留程序时需要 join 若干个来自不同数据库的表。遇到了 collation 冲突的错误。之前虽然也遇到但是并没有深入研究,只是用了指定 collation 的方式规避了冲突。

查询当前数据库 Collation

https://stackoverflow.com/questions/8488534

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

问题原因

在上述脚本的帮助下,大致就推断倒了问题原因。因为在测试时,用了 SELECT INTO 将一数据库下的表插入到了另一个数据库中。但是这两个数据库的默认 collation 是不同的。而 SELECT INTO 的方式令新表保留了原表的 collation。

更早的文章

Fix VS Reference Conflict

VS2013 项目中遇到警告”发现同一依赖程序集的不同版本间存在无法解决的冲突”的解决过程。

csharp继续阅读