I'm creating a web application that serves as a front end to do SQL Replication.
I have many scripts stored in the properties of the program. Let's use the first one as an example. The first script is the script that you get from creating a publication on the publisher server.
USE [<<SOURCE_DATABASE_NAME>>]
EXEC sp_replicationdboption @dbname = N'<<SOURCE_DATABASE_NAME>>',
@optname = N'publish', @value = N'true'
GO
USE [<<SOURCE_DATABASE_NAME>>]
EXEC [<<SOURCE_DATABASE_NAME>>].sys.sp_addlogreader_agent @job_login = N'XXX\Admin',
@job_password = NULL, @publisher_security_mode = 0,
@publisher_login = N'Admin', @publisher_password = N'<<PASSWORD>>',
@job_name = NULL
GO
USE [<<SOURCE_DATABASE_NAME>>]
EXEC sp_addpublication @publication = N'<<SOURCE_DATABASE_NAME>>',
@description = N'Transactional publication of database ''<<SOURCE_DATABASE_NAME>>'' from Publisher ''<<SOURCE_SERVER_NAME>>''.',
@sync_method = N'concurrent', @retention = 0, @allow_push = N'true',
@allow_pull = N'true', @allow_anonymous = N'false',
@enabled_for_internet = N'false', @snapshot_in_defaultfolder = N'true',
@compress_snapshot = N'false', @ftp_port = 21,
@allow_subscription_copy = N'false', @add_to_active_directory = N'false',
@repl_freq = N'continuous', @status = N'active',
@independent_agent = N'true', @immediate_sync = N'false',
@allow_sync_tran = N'false', @allow_queued_tran = N'false',
@allow_dts = N'false', @replicate_ddl = 1,
@allow_initialize_from_backup = N'false', @enabled_for_p2p = N'false',
@enabled_for_het_sub = N'false'
GO
EXEC sp_addpublication_snapshot @publication = N'<<SOURCE_DATABASE_NAME>>',
@frequency_type = 1, @frequency_interval = 1,
@frequency_relative_interval = 1, @frequency_recurrence_factor = 0,
@frequency_subday = 8, @frequency_subday_interval = 1,
@active_start_time_of_day = 0, @active_end_time_of_day = 235959,
@active_start_date = 0, @active_end_date = 0,
@job_login = N'ICS\Admin', @job_password = NULL,
@publisher_security_mode = 0, @publisher_login = N'Admin',
@publisher_password = N'<<PASSWORD>>'
Instead of running this script in SQL Management Studio, I want to use my web application to run it.
I tried:
public static void CreatePublication(string server, string query)
{
string finalConnString = Properties.Settings.Default.rawConnectionString.Replace("<<DATA_SOURCE>>", server).Replace("<<INITIAL_CATALOG>>", "tempdb");
using (SqlConnection conn = new SqlConnection(finalConnString))
{
using (SqlCommand cmd = new SqlCommand(query, conn))
{
conn.Open();
cmd.ExecuteNonQuery();
}
}
}
public static string ConstructCreatePublicationScript(string rawPublicationScript, string rawAddArticleScript,
string password, string sourceServerName, string sourceDatabaseName, List<string> selectedTables)
{
string createPublicationScript = "";
string addArticleScript = "";
createPublicationScript = rawPublicationScript.Replace("<<PASSWORD>>", password)
.Replace("<<SOURCE_SERVER_NAME>>", sourceServerName)
.Replace("<<SOURCE_DATABASE_NAME>>", sourceDatabaseName);
createPublicationScript = createPublicationScript + "\n\n";
foreach (string selectedTable in selectedTables)
{
addArticleScript = rawAddArticleScript.Replace("<<SOURCE_DATABASE_NAME>>", sourceDatabaseName)
.Replace("<<SOURCE_TABLE_NAME>>", selectedTable);
createPublicationScript = createPublicationScript + addArticleScript + "\n\n";
}
//write script to file
return createPublicationScript;
}
But ran into this error:
SqlException was caught
Incorrect syntax near 'GO'.
Incorrect syntax near 'GO'.
Incorrect syntax near 'GO'.
Incorrect syntax near 'GO'.
Incorrect syntax near 'GO'.
My question is, how can I run this whole script above in C#? Should I just get rid of the "GO" keywords?
read the file. when you come across "GO" submit the query to server (without "GO" itself) and then go on reading.
The
GO
command is not an SQL command, it's a command in SQL Management Studio. It separates batches in a script.To run the script as SQL, split it on
"GO"
and execute each string by itself.(You might want to use a regular expression like
\bGO\b
or\sGO\s
to do the split, so that you catch only occurances that is not part of a word, if you would happen to have an identifier that contains "go".)Change your ConstructCreatePublicationScript to return a
List<string>
where each string element is a piece of your complete script splitted at the GO statement. This is necessary because the GO is the separator used by Management Studio and not a SQL statementthen change your execution code to receive the list and execute each single string