Sql Azure数据库中的区分大小写的列名称

时间:2013-12-06 20:32:02

标签: sql sql-server database azure

永远我在Sql Server中使用了区分大小写的排序规则(SQL_Latin1_General_CP1_CS_AS)。我正在尝试迁移到Sql Azure数据库,我遇到了一个意想不到的问题。看起来像是不可能有区分大小写的列名。这可能是真的吗?

我创建了我的数据库......

CREATE DATABASE MyDatabase
COLLATE SQL_Latin1_General_CP1_CS_AS

我创造了我的桌子......

CREATE TABLE [MyTable]
(
    [Name] NVarChar (4000) COLLATE SQL_Latin1_General_CP1_CS_AS NULL,
    [name] NVarChar (4000) COLLATE SQL_Latin1_General_CP1_CS_AS NULL                                                                                
)

我收到错误: 每个表中的列名必须是唯一的。表'MyTable'中的列名'name'被多次指定。

唉,灾难。这在Sql Server 2012中完美运行。但是在Sql Azure上,我似乎无法实现它。有谁知道为什么这不适用于Sql Azure?有谁知道如何在Sql Azure中使这项工作?感谢。

3 个答案:

答案 0 :(得分:8)

我认为这是Windows Azure SQL中的一个错误!

在线文档声明您可以覆盖数据库,列或表达式级别的排序规则。您无法在服务器级别执行此操作。

http://msdn.microsoft.com/en-us/library/windowsazure/ee336245.aspx#sscs

让我们从我们知道可行的东西开始,本地安装SQL Server 2012。

-- Start at master
Use master;
Go

-- Create a new database
CREATE DATABASE Koopa
  COLLATE SQL_Latin1_General_CP1_CS_AS;

-- Use the new database
Use Koopa;
Go

-- Create a new table
CREATE TABLE [MyTable]
(
    [ColName1] NVarChar (4000) COLLATE SQL_Latin1_General_CP1_CS_AS NULL,
    [colname1] NVarChar (4000) COLLATE SQL_Latin1_General_CP1_CS_AS NULL                                                                                
);

如果我们尝试在MASTER数据库中运行create table,我们会收到您的错误。

Msg 2705,Level 16,State 3,Line 2

每个表中的列名必须是唯一的。表'MyTable'中的列名'colname1'被多次指定。

如果我们在Koopa数据库中运行create table,它可以正常工作。见下图。那是因为MASTER是Case Insensitive CI!

enter image description here

我将使用Web Interface for Azure SQL数据库,因为它有很好的颜色(它是网络)!

让我们使用Case Sensitive排序规则创建一个新数据库。哇我很兴奋,因为可以选择我们的校对。

enter image description here

现在我们有了一个新数据库,让我们检查设置!

enter image description here

我仍然很高兴,因为我们看到为数据库列出了正确的排序规则。

让我们直接登录到数据库服务器并运行一个简单的查询来创建表。

我将首先尝试设计师!

enter image description here

哎呀,它没用。

让我们在查询窗口中尝试一个简单的DDL语句。

enter image description here

现在我真的很失望。我们卖的是商品清单,但Azure SQL没有提供。

简而言之,文档说您无法在服务器级别设置排序规则。

http://technet.microsoft.com/en-us/library/ms143726.aspx

然而,BOL的这个引用声明我们应该能够在数据库级别过度使用它。

服务器级排序规则 默认服务器排序规则在SQL Server安装期间设置,并且还成为系统数据库和所有用户数据库的默认排序规则。请注意,在SQL Server安装过程中无法选择仅Unicode的排序规则,因为它们不支持作为服务器级排序规则。

enter image description here

简而言之,在接下来的7天里,我非常忙于为PASS做几次演讲。我将不得不打开一个错误报告,看看是否有一个已经打开过。

很好找!!

BTW - 您现在需要使用不同的列名。

答案 1 :(得分:0)

在SQL Server中,有两个级别的排序规则:服务器级排序规则,它会影响DDL事务(例如,表格和列名称);和数据库级排序规则,它会影响数据库中包含的表的内容(即varchar列值)。

在SQL Server中,在服务器设置期间指定数据库级排序规则。您可能在安装SQL Server时将其设置为自定义。因为您无法控制SQL Azure的服务器级配置,这意味着您必须遵循Microsoft的排序规则,在这种情况下,不要使用区分大小写的DDL标识符,这无论如何都是很好的做法。

本质量检查详细说明:Does sqlserver collation mean column names must be correct case? And how to deal with that

答案 2 :(得分:0)

要解决您的情况,您需要添加CATALOG_COLLATION。

CREATE DATABASE MyDatabase COLLATE SQL_Latin1_General_CP1_CS_AS WITH CATALOG_COLLATION = DATABASE_DEFAULT 

来源:What will happen with CATALOG_COLLATION and Case Sensitive vs Case Insensitive

不幸的是,您似乎只能在其中输入两个值: SQL_Latin1_General_CP1_CI_AS或DATABASE_DEFAULT

我有镜子问题。我想将架构对象(表名称,列名称等)设置为CI,将数据库内部的数据设置为CS。 -默认情况下,此功能可在Azure中与CS COLLATE一起使用。在数据库创建时设置了SQL_Latin1_General_CP1_CS_AS。 但是它不适用于本地SQLEXPRESS数据库,这是在本地测试应用程序的问题。创建数据库区分大小写的CS时,所有查询也会开始也区分大小写。这使我的休眠状态停止工作。 (对象不存在等)。

要解决此问题,我需要使用SQL_Latin1_General_CP1_CI_AS COLLATE创建数据库,并分别为每列定义CS COLLATE:

create table test (
 pk int PRIMARY KEY,
 data_cs varchar(123) COLLATE SQL_Latin1_General_CP1_CS_AS,
 CONSTRAINT [unique_data] UNIQUE NONCLUSTERED (data_cs)
)

insert into TEST values (1, 'ABC');
insert into tEsT values (2, 'abc');

select * from TEST where DATA_cs like 'A%'

CATALOG_COLLATION仅在Azure SQL中有效。