在SQL Azure数据库区分大小写列名

问题描述 投票:3回答:3

永远我用在SQL服务器(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的”被指定多次。

哎,灾难。这工作完全在SQL Server 2012中但是在SQL Azure的我似乎无法做到这一点。有谁知道这是为什么不在SQL Azure的工作?有谁知道我怎样才能使在SQL Azure的这项工作?谢谢。

sql sql-server database azure
3个回答
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数据库中创建表,我们得到您的错误。

消息2705,级别16,状态3,2号线

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

如果我们在库巴数据库运行创建表,它工作正常。见下图。这是因为MASTER不区分大小写CI!

我要使用Azure的SQL数据库的Web界面,因为它有漂亮的颜色(它是Web)!

让我们创建一个区分大小写归类的新数据库。哇,我很激动,因为那里是选择我们的校对选项。

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

我还是很开心,因为我们看到的数据库中列出的正确的排序规则。

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

我将首先尝试的设计师!

哎呀,它没有工作。

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

现在,我真的很失望。我们所售商品的法案,但SQL Azure中并没有提供。

总之,文件说,你不能设置排序在服务器级别。

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

然而,从BOL这句话指出,我们应该能够在骑在数据库级别。

服务器级排序规则的默认服务器排序规则的SQL Server安装过程中设置,也成为系统数据库和所有用户数据库的默认排序规则。需要注意的是仅Unicode排序规则不能SQL Server安装过程中选择,因为它们不支持作为服务器级排序规则。

总之,我有一对夫妇的演讲为PASS未来7天忙得不亦乐乎。我将不得不打开一个Bug报告,或者看看是否有一个已经打开。

好找!

顺便说一句 - 您现在需要使用不同的列名。


0
投票

在SQL Server中,有整理的两个层次:服务器级排序规则,从而影响DDL事项(在这种情况下,例如,表和列名);和数据库级排序规则,这会影响包含数据库内的表的内容(即varchar列值)。

在SQL Server,服务器安装过程中指定的数据库级排序规则。你可能当你安装你的SQL Server将其设置为自定义的东西。因为你无法控制SQL Azure的的服务器级别的配置就意味着你必须使用不区分大小写的DDL标识符,这是很好的做法反正符合微软的整理,在这种情况下。

这将在本QA详细:Does sqlserver collation mean column names must be correct case? And how to deal with that


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。 - 这默认使用CS COLLATE如工作在Azure上。 SQL_Latin1_General_CP1_CS_AS在数据库创建设置。不过,这并不在本地SQLEXPRESS数据库这是测试应用程序的问题当地工作。当您创建数据库区分大小写CS然后所有查询开始区分大小写了。这使我的休眠停止工作。 (对象不存在等)。

为了解决这个问题,我需要创建数据库SQL_Latin1_General_CP1_CI_AS整理和定义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%'

在SQL Azure的作品CATALOG_COLLATION只有我猜。

© www.soinside.com 2019 - 2024. All rights reserved.