2014-05-06 39 views
8

我有一个使用批量插入获取数据的临时表。但是,当我想要将临时表中的数据更新到普通表时,它会产生排序问题。我知道如何使用像来解决这个问题:在临时表列中设置排序规则的正确方法TSQL

UPDATE RegularTable 
SET r.Column1 = t.ColumnA 
FROM RegularTable r INNER JOIN #TEMP t ON 
r.Column1 COLLATE DATABASE_DEFAULT = 
t.ColumnA COLLATE DATABASE_DEFAULT 

但是,有没有办法设置在临时表中的排序规则立刻让你不必使用整理中加入吗?例如:

CREATE TABLE #TEMP 
Column1 varchar(255) COLLATE database_default, 
Column2 varchar(60) 

这是正确的编码,您是否必须为每个表格或每列设置一次排序? 如果在表格中设置了排序规则,是否可以从排序中排除排序规则?

回答

11

您可以使用您所描述的语法在临时表定义中使用COLLATE database_default,这将使每列与您的数据库进行排序规则兼容。

您必须为每列明确设置它。没有表级默认排序规则。有一个数据库级默认排序规则,但对于tempdb,这总是等于model数据库的默认排序规则,默认情况下为服务器排序规则。

如果您在表列中设置排序规则,您仍然可以在查询中覆盖它,就像您已经经历的那样。

+0

感谢@Christian Hayter,所以如果我为每一列设置COLLATE database_default,我不必在连接中使用collat​​e?出于好奇,是否有办法查看默认服务器排序规则设置是什么? – J3FFK

+0

@ J3FFK:这是正确的。至于查看当前的排序规则,我确定有一个T-SQL函数来获取它,但通常我只是在Management Studio中调出数据库属性对话框。 :-) –

+0

@ J3FFK:您可以从'master.sys.databases.collat​​ion_name'读取db排序规则 –

1

我们现在遇到了同样的问题。我们只是将临时表创建更改为表变量声明,而不是将每个临时表连接添加到排序表中。