Имея ту же необходимость автоматического запуска сгенерированного сценария базы данных из кода, я решил разобрать сценарий SQL, чтобы удалить операторы GO, и разделить сценарий на отдельные команды (как предложено @MattBrunell). Удалить операторы GO было легко, но разделить операторы на "\r\n"
не получилось, так как это испортило многострочные операторы. Протестировав несколько разных подходов, я с удивлением обнаружил, что сценарий вообще не нужно разбивать на отдельные команды. Я просто удалил все операторы "GO" и отправил весь скрипт (включая комментарии) в SqlCommand:
using System.Data.SqlClient;
using(SqlConnection connection = new SqlConnection(connectionString))
using(SqlCommand command = connection.CreateCommand())
{
string script = File.ReadAllText("script.sql");
command.CommandText = script.Replace("GO", "");
connection.Open();
int affectedRows = command.ExecuteNonQuery();
}
Этот код был протестирован с SQL Server 2008 R2 и сценарием, созданным с помощью «База данных -> Задачи -> Создать сценарии ...». Ниже приведены некоторые примеры команд в сценарии:
USE [MyDatabase]
ALTER TABLE [MySchema].[MyTable] DROP CONSTRAINT [FK_MyTable_OtherTable]
DROP TABLE [MySchema].[MyTable]
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
/****** Object: Table [MySchema].[MyTable] Script Date: 01/23/2013 13:39:29 ******/
CREATE TABLE [MySchema].[MyTable](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Subject] [nvarchar](50) NOT NULL,
[Body] [nvarchar](max) NOT NULL,
CONSTRAINT [PK_MyTable] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
SET IDENTITY_INSERT [MySchema].[MyTable] ON
INSERT [MySchema].[MyTable] ([Id], [Subject], [Body]) VALUES (1, N'MySubject', N'Line 1
Line 2
Line 3
Multi-line strings are also OK.
')
SET IDENTITY_INSERT [MySchema].[MyTable] OFF
Я предполагаю, что может быть некоторая максимальная длина для одной SqlCommand, выше которой скрипт должен быть разбит. Мой скрипт, который выполняется без проблем, содержит около 1800 операторов и составляет 520 КБ.