永远我在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中使这项工作?感谢。答案 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!
我将使用Web Interface for Azure SQL数据库,因为它有很好的颜色(它是网络)!
让我们使用Case Sensitive排序规则创建一个新数据库。哇我很兴奋,因为可以选择我们的校对。
现在我们有了一个新数据库,让我们检查设置!
我仍然很高兴,因为我们看到为数据库列出了正确的排序规则。
让我们直接登录到数据库服务器并运行一个简单的查询来创建表。
我将首先尝试设计师!
哎呀,它没用。
让我们在查询窗口中尝试一个简单的DDL语句。
现在我真的很失望。我们卖的是商品清单,但Azure SQL没有提供。
简而言之,文档说您无法在服务器级别设置排序规则。
http://technet.microsoft.com/en-us/library/ms143726.aspx
然而,BOL的这个引用声明我们应该能够在数据库级别过度使用它。
服务器级排序规则 默认服务器排序规则在SQL Server安装期间设置,并且还成为系统数据库和所有用户数据库的默认排序规则。请注意,在SQL Server安装过程中无法选择仅Unicode的排序规则,因为它们不支持作为服务器级排序规则。
简而言之,在接下来的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中有效。