У меня возникла проблема с запуском SQL-скриптов, сгенерированных диалогом Publish> Generate Scripts в проекте базы данных SQL Server (Visual Studio 2013).Выполнение публикации скриптов с SQLCMD не возвращается
Сгенерированный скрипт выполняется нормально и обычно с 2 до 10 секунд, если выполняется из SQL Management Studio в режиме SQLCMD. Однако, если вы используете SQLCMD.exe (через CMD или пакетный файл), он, кажется, зависает и никогда не заканчивается. Я предполагаю, что есть некоторые дополнительные параметры (preset?), Которые 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 просто никогда не выходит, что побудило меня чтобы убить процесс. Ниже приведен пример типа сценария, созданного в диалоговом окне Publish:
/*
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 (см. пример выше). При запуске в режиме SCLCMD из MS SQL Management Studio скрипт никогда не вернется. Если, однако, я запускаю сценарий НЕ в режиме SQLCMD, пусть он выходит из строя, а затем повторно запускает его в режиме SQLCMD, он выполняется успешно.
Существует немного кода, который я заметил, возвращает ошибку (к сожалению, у меня нет сообщения об ошибке, но я буду обновлять, когда я получаю сообщение об ошибке снова), когда сценарий не возвращает whilerunning в режиме 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)]. Я подозреваю, что это тот же самый сценарий, который выполняется при запуске из линии CMD с помощью SQLCMD.exe. Я надеюсь, что это поможет, но я продолжу поиск решения и EDIT этот пост, когда я это сделаю. Благодарю.