关于数据库项目、生成和部署问题的疑难解答

更新:2010 年 7 月

在创建、修改、生成或部署数据库项目时,可能会遇到以下问题:

  • 数据库对象中的错误

  • 使用 Microsoft SQL Server 2005 中新增的保留关键字

  • 命令行生成中的差异

  • 依赖项与更新脚本

  • 带引号的标识符可能导致项目重新加载发生错误

  • 数据库的内部状态与其内容不一致

  • 撤消挂起的更改

  • 找不到 Windows NT 用户或组

  • 重复的对象名和排除文件

  • 数据库限定名称和服务器限定名称

  • 导入数据库架构的性能

  • 生成错误导航

  • 使用交叉数据库引用时出现语法错误

  • 重命名 SQLCLR 项目和程序集

  • FULLTEXT STOPLIST 的语法不受支持

  • SORT_IN_TEMPDB 子句未导入

  • 当导入包含多个语句的表值函数时,带引号的标识符状态丢失

  • 生成项目后未清除某些项目错误

  • 后期部署脚本中的语法不正确

数据库对象中的错误

当数据库对象中包含一个或多个语法错误时,**“错误列表”**窗口中会显示关联的错误消息。

提示

出现在“错误列表”中的错误消息应提供有关如何解决错误的信息。 解决错误并保存数据库对象后,该数据库对象的图标就会返回到其典型状态,并从“错误列表”窗口中移除该错误。

使用 Microsoft SQL Server 2005 中新增的保留关键字

SQL Server 2005 中新增了以下保留关键字:EXTERNAL、PIVOT、REVERT、TABLESAMPLE 和 UNPIVOT。 如果将这些保留关键字用作针对 Microsoft SQL Server 2005 或 SQL Server 2008 的数据库项目中的架构对象名称,则**“输出”**窗口中会出现一个错误。

提示

若要解决这个限制,可将架构对象名称放在引号中。 例如,您可以使用 "CREATE TABLE [External] (c1 INT)"。

命令行生成中的差异

如果在 Visual Studio 中打开项目时执行命令行生成,则无法接收在用户界面中进行生成时可接收的全部生成错误。

提示

若要解决这个问题,请在执行命令行生成前在 Visual Studio 中关闭数据库项目。

依赖项与更新脚本

为了在更新脚本中生成正确的对象顺序,架构比较会检查对象依赖项。 例如,如果视图依赖于表,则该表必须先于视图创建。 如果依赖于其他对象的对象不使用架构限定的名称,则可能无法标识依赖项,更新或创建脚本中语句的顺序可能不正确。 更新“目标”使其与“源”匹配或者将更改部署到数据库时,这种差异就可能导致错误。 数据库生成脚本同样存在这个问题。

提示

若要解决此问题,请确保对涉及依赖关系的对象的名称进行架构限定。 在 Visual Studio 高级专业版和 Visual Studio 旗舰版中,可以使用数据库重构完全限定对象名称。 有关更多信息,请参见完全限定数据库对象的名称。在下面的示例中,如果将语句结尾更改为引用 [dbo].[KeysTable] 而不仅仅是 KeysTable,就可以保证依赖关系将正确标识:

CREATE VIEW [NewUser].[ViewReferencingScalarFunction] AS SELECT Column2, dbo.SimpleMultiplyParamByTwo(PK_Column) AS [Function] FROM KeysTable

带引号的标识符可能导致项目重新加载发生错误

如果在数据库属性中清除了**“SET QUOTED_IDENTIFIER”**复选框,则在保存对象或加载包含带引号的标识符的数据库时将出现此错误。 如果从使用了带引号的标识符的数据库导入数据库架构,则会出现这种情况。

提示

若要解决此问题,可以使用两种方法。 可以修改对象定义,用方括号代替引号。 例如,可以将 "My Table" 更改为 [My Table]。 也可以打开“项目”菜单,单击“数据库项目 属性”,再单击“数据库属性”选项卡,选中“SET QUOTED_IDENTIFIER”复选框。

数据库的内部状态与其内容不一致

使用 Visual Studio 高级专业版时可能会收到以下错误:“数据库项目的内部状态与其内容不一致。 您必须卸载该项目并重新加载才能解决这个问题。”此错误说明,在某种程度上,该项目(它维护其自认其包含的文件的列表)不再与文件的状态同步。 遇到此问题的最常见原因是在未打开数据库项目时从磁盘中删除了项目中的某个文件。 如果导入数据库架构时出现问题,则也可能导致此错误。

提示

若要解决此问题,可以在“架构视图”中单击“同步”。 如果不起作用,可以卸载并重新加载数据库项目。 为此,请在“解决方案资源管理器”中单击该项目。 打开“项目”菜单,然后单击“卸载项目”。 卸载项目后,打开“项目”菜单,然后单击“重新加载项目”

撤消挂起的更改

在使用版本控制系统的“撤消挂起的更改”命令之后,**“架构视图”不会自动刷新。 例如,如果对一个表或一列进行了重命名,然后撤消这些更改,则“架构视图”**中将出现消息“外部文件更改,需要重新同步...”。

提示

若要解决此问题,必须在“架构视图”工具栏上单击“同步”

找不到 Windows NT 用户或组

如果数据库项目引用不可用的登录名,则将出现以下错误消息:“找不到 Windows NT 用户或组‘DomainName\LoginName’。 请再次检查该名称。”如果您所使用的计算机与从中导入架构的数据库不在同一个域中,就有可能会遇到此问题。 如果您在家处理从其他地方创建的数据库项目,通常会出现这种情况。 在这种情况下,不能生成或部署数据库项目。

提示

创建用户时可以省略 FOR LOGIN 子句。 例如,可以使用以下语句:CREATE USER [Domain\someLogin]。 当部署数据库项目时将创建该用户,并将其与 [Domain\someLogin] 登录关联起来,但在数据库项目中不需要对该登录的引用。

重复的对象名和排除文件

如果数据库项目中有重复的对象名称(例如,两个表的名称均为 Orders),则**“错误列表”**窗口中会出现错误。 即使通过排除包含某个重复对象的定义的文件来解决此问题,该错误消息也不会立即消失。

提示

若要解决此问题,可以单击“刷新”,也可以修改包含对象定义的文件,重命名该对象,然后保存该文件。

数据库限定名称和服务器限定名称

在 Visual Studio 高级专业版中创建对象时,对象将按照 [schema].[object].[child] 命名约定来命名。 如果您希望引用其他数据库或其他服务器中的对象,则可以包括以下格式的数据库名称和服务器名称:[server].[database].[schema].[object].[child]。 如果所创建的存储过程或视图引用的对象需要使用数据库限定名称或服务器限定名称,则将出现一个警告。

提示

若要解决此警告,必须定义一个跨数据库引用。 有关跨数据库引用的更多信息,请参见在数据库项目中使用引用如何:添加对数据库项目的引用

重要说明重要事项

如果项目中包含有关数据库限定名称或服务器限定名称的未解决的警告,而且您在数据库项目属性的“生成”选项卡上选中了“将警告视为错误”复选框,则部署将失败。 失败的原因是数据库限定名称或服务器限定名称会生成警告。 如果您使用的是数据库限定名称或服务器限定名称,则必须清除“将警告视为错误”复选框。

导入数据库架构的性能

如果在**“测试列表编辑器”窗口或“测试视图”窗口处于打开状态时导入数据库架构,则完成导入操作所花的时间将显著增加。 无论是在“新建数据库向导”(如果选择了导入数据库架构)中还是在“导入数据库架构”操作过程中,都会出现这种性能下降的情况。 即使在导入数据库架构前关闭了“测试列表编辑器”窗口和“测试视图”**窗口,也会出现此问题。

提示

若要解决此问题,必须关闭“测试列表编辑器”窗口和“测试视图”窗口,关闭并重新启动 Visual Studio,然后导入数据库架构。 对于较小的架构,可能不需要执行这些步骤;对于 AdventureWorks 示例数据库,在“测试列表编辑器”窗口处于关闭状态时导入架构操作需花费 27 秒,在“测试列表编辑器”窗口处于打开状态时则需花费 48 秒。

生成错误导航

如果部署失败,则无法通过更新所产生的生成脚本来更正错误。 必须更正用于产生该生成脚本的源文件。 如果在**“错误列表”**窗口中双击某一部署错误,则生成脚本将出现在编辑器中,并显示导致此错误的行。

提示

若要解决此问题,必须查看生成脚本以确定失败的原因,但随后必须修改数据库项目中包含此错误的源文件。 例如,如果后期部署脚本 Script.PostDeployment.sql 包含错误,则必须修改 Script.PostDeployment.sql 而非生成脚本。

使用交叉数据库引用时出现语法错误

在保存某个对象定义,而且该对象定义中包含对其他数据库中对象的引用时,可能会收到一个或多个语法错误。 例如,可以添加对数据库项目的引用,定义名为 RefServer 和 RefDatabase 的变量并为它们赋值, 然后按如下方式定义一个视图:

CREATE VIEW [dbo].[MyView]
AS
SELECT * FROM $(RefServer).$(RefDatabase).dbo.TableName

在保存该定义时,可能会收到一条或多条指示语法不正确的错误消息。 这些错误消息可能引用设计时验证数据库的名称,这可能会令人混淆。

提示

若要解决此问题,必须将变量名括在中括号中。 若要纠正本示例中的问题,请按如下方式进行更改:

CREATE VIEW [dbo].[MyView]
AS
SELECT * FROM [$(RefServer)].[$(RefDatabase)].dbo.TableName

重命名 SQLCLR 项目和程序集

在某个数据库项目包含对 SQLCLR 项目或程序集的引用的情况下,如果您重命名该数据库项目但是未更新引用,将无法部署该数据库项目。

提示

若要解决此问题,请移除旧引用,然后使用更新的名称添加对 SQLCLR 项目或程序集的引用。

FULLTEXT STOPLIST 的语法不受支持

Visual Studio 高级专业版不对 CREATE FULLTEXT STOPLIST 语句的可选 FROM { [数据库名称.] 源非索引字表名称 } | SYSTEM STOPLIST ] 语法进行建模。 如果您导入使用该语法的对象,将忽略该语法。

提示

若要解决此问题,您必须向后期部署脚本中手动添加非索引字。 有关更多信息,请参见如何:指定预先部署或后期部署脚本

SORT_IN_TEMPDB 子句未导入

Visual Studio 高级专业版无法导入索引的 SORT_IN_TEMPDB 子句。 例如,您可能有以下代码:

CREATE TABLE [dbo].[IndexTable]
{
[Column1] [INT] NOT NULL
}
GO
CREATE NONCLUSTERED INDEX [SortInTempDbOn] ON [dbo].[IndexTable]
{
[Column1] ASC
} 
WITH (SORT_IN_TEMPDB = ON)
GO

索引导入时未包含 SORT_IN_TEMPDB 子句。

提示

若要解决此问题,当将数据库中的更改导入项目时,必须手动更正索引定义。

当导入包含多个语句的表值函数时,带引号的标识符状态丢失

您可以导入包含多个语句的表值函数,但是带引号的标识符字符串的状态不会保存到 SQL Server 中。 由于带引号的标识符的默认设置为“启用”,因此当导入这些函数时,可能发生错误。

提示

若要解决此问题,必须在导入对象和设置之后,或在将数据库中的更新写入项目之后,更改所有包含多个语句的表值函数的带引号的标识符设置。

重新生成项目后未清除某些项目错误

在您解决数据库项目中遇到的一些错误的根源后,即使重新生成项目,这些错误也仍然存在。 例如,如果使用 Windows 资源管理器删除项目所引用的 .sqlpermissions 文件,则必然出现错误。 如果使用解决方案资源管理器从项目中移除该文件,然后重新生成,则即使您更正了错误,错误也仍然存在。

提示

若要解决此问题,必须在解决方案资源管理器中的工具栏上,单击“重新分析项目”。

后期部署脚本中的语法不正确

默认情况下,Visual Studio 2010 中的 Transact-SQL 编辑器中已禁用 SQLCMD 模式。 之所以做出此更改,是因为在启用 SQLCMD 模式时,Intellisense 未处于活动状态。 部署时,如果您的后期部署脚本中包含了语句,则会显示以下错误。

Incorrect syntax near ':'. C:\MySandbox\MySolution\MyProject\Scripts\Post-Deployment\Script.PostDeployment.sql

提示

若要解决此问题,您必须启用 SQLCMD 模式。 若要启用 SQLCMD 模式,请单击“Transact-SQL 编辑器”工具栏上的“SQLCMD 模式”

请参见

任务

如何:修改数据库对象

如何:比较并同步两个数据库的数据

概念

重命名对数据库对象的所有引用

重命名对数据库对象的所有引用

修订记录

日期

修订记录

原因

2010 年 7 月

已添加一个项,用于警告用户更改 Visual Studio 2010 中的默认行为可能会导致其后期部署脚本出现问题。

客户反馈