我在SQL Server 2008 R2中有一个数据库项目。我在这个项目中有一张表,例如:
CREATE TABLE [dbo].[MyTable](
[IDField] [int] IDENTITY(1,1) NOT NULL,
[AnotherField] [int] NULL,
[StrangeBehaviour] [varchar](50) NULL,
CONSTRAINT [PK_MyID] PRIMARY KEY CLUSTERED
(
[IDField] ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
表脚本如下所示。当我使用vsdbcmd.exe部署项目时,它按预期创建/更新表。
但是,在对象资源管理器中的SSMS中,如果我在目标数据库上选择表格列“StrangeBehaviour”并选择“属性”或“修改”,那么我会看到整理正在设置为除数据库默认值之外的其他内容(默认为Windows Collation - > Latin1_General。然后将其设置为看似随机的Windows排序规则。
如果我在SSMS中将表格编写为“插入到”,那么我看不到更改的排序规则。
因此我有两个问题:
我的印象是升级脚本基于数据库项目中的SQL - 不是这种情况,如果没有,我该如何访问其他数据?
当所有脚本都没有引用更改的排序规则时,如何在目标数据库中保留此属性?
答案 0 :(得分:1)
Properties > Database.sqlsettings
下的数据库项目中有一个数据库归类属性。从Visual Studio或VSDBCMD部署时生成的脚本将默认排序规则更改为此设置中指定的排序规则(如果它已不匹配)。
然后,Visual Studio中部署创建的列的排序规则将基于此设置。
我已经通过使用默认排序规则Latin1_General_CI_AS
创建新数据库对此进行了测试。然后,我创建了一个新的数据库项目,其默认排序规则设置为SQL_Latin1_General_CP1_CI_AS
。这是Visual Studio创建的部署脚本:
...
ALTER DATABASE [$(DatabaseName)] COLLATE SQL_Latin1_General_CP1_CI_AS;
GO
USE [$(DatabaseName)]
GO
/*
Pre-Deployment Script Template
...
*/
GO
PRINT N'Creating [dbo].[MyTable]...';
GO
CREATE TABLE [dbo].[MyTable] (
[IDField] INT IDENTITY (1, 1) NOT NULL,
[AnotherField] INT NULL,
[StrangeBehaviour] VARCHAR (50) NULL,
CONSTRAINT [PK_MyID] PRIMARY KEY CLUSTERED ([IDField] ASC) WITH (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON, PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF) ON [PRIMARY]
);
GO
...
答案 1 :(得分:0)
在SQL Server Management Studio(SSMS)中,有一个选项可以自动为通过GUI完成的更改生成脚本。 SSMS中提供了此问题的解决方案,并与SQL Server 2005和SQL Server 2008一起使用。
启用选项
从SSMS菜单中单击“工具”
点击“选项...”
点击“设计师”
选中“自动生成更改脚本”复选框
答案 2 :(得分:0)
我遇到类似问题,因为我的键盘上有一个问题:İ
(土耳其语i)
可能是这种情况:
您的vsdbcmd.exe
工具会从Windows排序规则中进行合并。
这不是随机的,请从以下位置检查您的窗口:
http://msdn.microsoft.com/en-us/library/aa176553%28v=sql.80%29.aspx
这里有一个关于windows collation vs sql collation的很棒的链接:
http://msdn.microsoft.com/en-us/library/ms143508.aspx
我不是sql家伙,但我的查询包括id
转到İD
当我从sql表的上下文菜单中说Select Top 1000 rows
时。
因为如果失败,它会使用Windows排序规则。
但是,当我从sql表的上下文菜单中说Edit Top200 rows
时,它可以工作。