RickZeeland
Ниже приведена процедура выполнения SQL команд из встроенного скрипта SSMS ресурса с помощью команд GO:
public static void CreateDatabase(string server, string catalog, string username, string password)
{
// get the stream
Stream stream = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("MyNamespace.DatabaseUnicode.sql");
if (stream != null)
{
var sr = new StreamReader(stream);
var script = sr.ReadToEnd();
sr.Close();
stream.Close();
var connectionString = GetConnectionString(server, string.Empty, username, password);
using (var connection = new SqlConnection(connectionString))
{
connection.Open();
if (connection.State == System.Data.ConnectionState.Open)
{
// replace it with the correct catalog name
script = script.Replace("##ArchiveName##", catalog);
IDbCommand command = connection.CreateCommand();
command.CommandType = CommandType.Text;
script = script.Replace("'", "''");
script = script.Replace("\r\nGO\r\n", "\x07"); // "GO" is not a Transact SQL command, but utilities command
script = script.Replace("\r\ngo\r\n", "\x07");
script = script.Replace("\r\nGo\r\n", "\x07");
script = script.Replace("\r\ngO\r\n", "\x07");
string[] arrBatches = script.Split('\x07');
for (int i = 0; i < arrBatches.Length; ++i)
{
string scriptBatch = arrBatches[i];
if (scriptBatch == string.Empty)
{
continue;
}
string sqlScript = string.Format("sp_executesql N'{0}'", scriptBatch);
command.CommandText = sqlScript;
command.CommandTimeout = SqlCommandTimeout;
command.ExecuteNonQuery();
}
}
}
SqlConnection.ClearAllPools();
}
else
{
throw new Exception("The resource sql script could not be found");
}
}
RickZeeland
Интересно, использует ли кто-нибудь это, я никогда не видел его в использовании, но мои знания SQL Server становятся ржавыми, когда мы перешли на PostgreSQL много лет назад.
В любом случае, спасибо, что напомнили нам об этом варианте :)