2015-01-27 1 views
4

У меня возникла проблема с запуском 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 этот пост, когда я это сделаю. Благодарю.

ответ

4

Ну .. после изучения этого в течение некоторого времени я, наконец, выяснил решение моей проблемы (если не ответ на вопрос, почему это не работает).

Существует опция во время публикации или генерации сценария базы данных из проекта базы данных, который останавливал развертывание. Как уже упоминалось в исходном вопросе, виновником была ALTER DATABASE [$ (DatabaseName)].

Если вы находитесь в диалоговом окне «Опубликовать базу данных», вы можете нажать кнопку «Дополнительно ...», чтобы просмотреть дополнительные параметры публикации. Отмена проверки флажка «Развертывание свойств базы данных» создаст ваш сценарий публикации БЕЗ начальных инструкций ALTER DATABASE, которые SQLCMD держит.

Надеюсь, это поможет сэкономить кому-то еще некоторое время. Ура!

0

У меня была аналогичная проблема.

Я прокомментировал этот раздел.

Далее я указал имя моей базы данных в связи с базой данных.(Наверху прямо из менеджера сервера студии MS SQL)

And everything was done successfully. 
    --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 

enter image description here

Смежные вопросы