我遇到运行由Publish>生成的SQL脚本的问题。在SQL Server数据库项目(Visual Studio 2013)上生成“脚本”对话框。
生成的脚本执行正常,如果在SQLCMD模式下从SQL Management Studio运行,通常会持续2到10秒。但是,如果使用SQLCMD.exe(通过CMD或批处理文件)运行,它似乎挂起并且永远不会完成。我猜测SQL Management Studio正在使用一些额外的参数(预设?)来执行脚本但我无法直接使用SQLCMD。正在生成的SQL脚本通常最多只有200行。这是我正在使用的命令(在Windows Server 2012R2上以批处理文件的形式运行,以管理员身份运行):
"D:\Program Files\Microsoft SQL Server\110\Tools\Binn\SQLCMD.exe" -S SQLSERVER1 -i "D:\Database\MyDatabase.publish.sql"
我没有看到任何错误,但SQLCMD从未退出,促使我必须杀死这个过程。下面是“发布”对话框创建的脚本类型的示例:
/*
Deployment script for MyDatabase
This code was generated by a tool.
Changes to this file may cause incorrect behavior and will be lost if
the code is regenerated.
*/
GO
SET ANSI_NULLS, ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER ON;
SET NUMERIC_ROUNDABORT OFF;
GO
:setvar DatabaseName "MyDatabase"
:setvar DefaultFilePrefix "MyDatabase"
:setvar DefaultDataPath "D:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\"
:setvar DefaultLogPath "D:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\"
GO
:on error exit
GO
/*
Detect SQLCMD mode and disable script execution if SQLCMD mode is not supported.
To re-enable the script after enabling SQLCMD mode, execute the following:
SET NOEXEC OFF;
*/
:setvar __IsSqlCmdEnabled "True"
GO
IF N'$(__IsSqlCmdEnabled)' NOT LIKE N'True'
BEGIN
PRINT N'SQLCMD mode must be enabled to successfully execute this script.';
SET NOEXEC ON;
END
GO
IF EXISTS (SELECT 1
FROM [master].[dbo].[sysdatabases]
WHERE [name] = N'$(DatabaseName)')
BEGIN
ALTER DATABASE [$(DatabaseName)]
SET READ_COMMITTED_SNAPSHOT OFF;
END
GO
IF EXISTS (SELECT 1
FROM [master].[dbo].[sysdatabases]
WHERE [name] = N'$(DatabaseName)')
BEGIN
ALTER DATABASE [$(DatabaseName)]
SET PAGE_VERIFY NONE
WITH ROLLBACK IMMEDIATE;
END
GO
USE [$(DatabaseName)];
GO
IF fulltextserviceproperty(N'IsFulltextInstalled') = 1
EXECUTE sp_fulltext_database 'enable';
GO
PRINT N'Dropping FK_ORDR_BPO_ORDR_MASTER...';
GO
ALTER TABLE [dbo].[ORDR_BPO] DROP CONSTRAINT [FK_ORDR_BPO_ORDR_MASTER];
GO
PRINT N'Dropping FK_ORDR_CommonData_ORDR_MASTER...';
GO
ALTER TABLE [dbo].[ORDR_CommonData] DROP CONSTRAINT [FK_ORDR_CommonData_ORDR_MASTER];
GO
PRINT N'Dropping FK_ORDR_BPO_ProductType_ValuationProductCategory...';
GO
ALTER TABLE [dbo].[ORDR_BPO_ProductType] DROP CONSTRAINT [FK_ORDR_BPO_ProductType_ValuationProductCategory];
GO
PRINT N'Creating [dbo].[LOG_ServiceAction]...';
GO
CREATE TABLE [dbo].[LOG_ServiceAction] (
[LOG_ServiceActionID] INT IDENTITY (1, 1) NOT NULL,
[ServiceActionName] VARCHAR (255) NOT NULL,
[User_ID] INT NOT NULL,
[TransactionID] VARCHAR (32) NOT NULL,
[Message] VARCHAR (1000) NOT NULL,
[ActionDate] DATETIME NOT NULL,
[FilePath] VARCHAR (2000) NULL,
[ExpiresDateUTC] DATETIME NOT NULL,
CONSTRAINT [PK_LOG_ServiceAction] PRIMARY KEY CLUSTERED ([LOG_ServiceActionID] ASC)
);
GO
PRINT N'Creating FK_ORDR_BPO_ORDR_MASTER...';
GO
ALTER TABLE [dbo].[ORDR_BPO] WITH NOCHECK
ADD CONSTRAINT [FK_ORDR_BPO_ORDR_MASTER] FOREIGN KEY ([MasterOrder_ID]) REFERENCES [dbo].[ORDR_MASTER] ([MasterOrder_ID]);
GO
PRINT N'Creating FK_ORDR_CommonData_ORDR_MASTER...';
GO
ALTER TABLE [dbo].[ORDR_CommonData] WITH NOCHECK
ADD CONSTRAINT [FK_ORDR_CommonData_ORDR_MASTER] FOREIGN KEY ([MasterOrder_ID]) REFERENCES [dbo].[ORDR_MASTER] ([MasterOrder_ID]);
GO
PRINT N'Checking existing data against newly created constraints';
GO
USE [$(DatabaseName)];
GO
ALTER TABLE [dbo].[ORDR_BPO] WITH CHECK CHECK CONSTRAINT [FK_ORDR_BPO_ORDR_MASTER];
ALTER TABLE [dbo].[ORDR_CommonData] WITH CHECK CHECK CONSTRAINT [FK_ORDR_CommonData_ORDR_MASTER];
GO
PRINT N'Update complete.';
GO
对此的任何帮助都将受到赞赏,因为这是自动化部署过程的最后一个手动步骤。
更新:所以我有更多相关信息可以帮助那些知道诊断这个问题的人......我发现的是Publish脚本在开头设置变量,比如DatabaseName(参考以上例子)。从MS SQL Management Studio以SCLCMD模式运行时,脚本有时永远不会返回。但是,如果我在SQLCMD模式下运行脚本NOT,让它失败,然后在SQLCMD模式下重新运行它,它会成功执行。
我注意到有一些代码返回错误(不幸的是,我没有错误消息但是当我再次收到错误时我会更新)当脚本在SQLCMD模式下运行时无法返回时:
IF EXISTS (SELECT 1
FROM [master].[dbo].[sysdatabases]
WHERE [name] = N'$(DatabaseName)')
BEGIN
ALTER DATABASE [$(DatabaseName)]
SET READ_COMMITTED_SNAPSHOT OFF;
END
脚本在ALTER DATABASE [$(DatabaseName)]命令上失败。我怀疑这是使用SQLCMD.exe从CMD线路运行时播放的相同场景。我希望这会有所帮助,但我会继续寻找解决方案,并在我这样做时编辑这篇文章。感谢。
答案 0 :(得分:7)
嗯..在调查了一段时间后,我终于找到了解决问题的方法(如果不是为什么它不起作用的答案)。
在从停止部署的数据库项目发布或生成数据库脚本期间,有一个选项。如原始问题所述,ALTER DATABASE [$(DatabaseName)]是罪魁祸首。
如果您在“发布数据库”对话框中,则可以单击“高级...”按钮以查看其他发布选项。取消选中“Deploy database properties”复选框将创建您的发布脚本,而不包含SQLCMD一直挂起的初始ALTER DATABASE语句。
希望这有助于为其他人节省一些时间。干杯!
答案 1 :(得分:2)