如何运行包含许多关键字的大型SQL脚本,包括使用C#的“GO”?

我正在创建一个Web应用程序,作为执行SQL复制的前端。

我有很多脚本存储在程序的属性中。 我们以第一个为例。 第一个脚本是您在发布服务器上创建发布时获得的脚本。

USE [<>] EXEC sp_replicationdboption @dbname = N'<>', @optname = N'publish', @value = N'true' GO USE [<>] EXEC [<>].sys.sp_addlogreader_agent @job_login = N'XXX\Admin', @job_password = NULL, @publisher_security_mode = 0, @publisher_login = N'Admin', @publisher_password = N'<>', @job_name = NULL GO USE [<>] EXEC sp_addpublication @publication = N'<>', @description = N'Transactional publication of database ''<>'' from Publisher ''<>''.', @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'<>', @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'<>' 

我想使用我的Web应用程序来运行它,而不是在SQL Management Studio中运行此脚本。

我试过了:

 public static void CreatePublication(string server, string query) { string finalConnString = Properties.Settings.Default.rawConnectionString.Replace("<>", server).Replace("<>", "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 selectedTables) { string createPublicationScript = ""; string addArticleScript = ""; createPublicationScript = rawPublicationScript.Replace("<>", password) .Replace("<>", sourceServerName) .Replace("<>", sourceDatabaseName); createPublicationScript = createPublicationScript + "\n\n"; foreach (string selectedTable in selectedTables) { addArticleScript = rawAddArticleScript.Replace("<>", sourceDatabaseName) .Replace("<>", selectedTable); createPublicationScript = createPublicationScript + addArticleScript + "\n\n"; } //write script to file return createPublicationScript; } 

但遇到了这个错误:

SqlException被捕获

‘GO’附近的语法不正确。
‘GO’附近的语法不正确。
‘GO’附近的语法不正确。
‘GO’附近的语法不正确。
‘GO’附近的语法不正确。

我的问题是,如何在C#中运行上面的整个脚本? 我应该摆脱“GO”关键词吗?

更改ConstructCreatePublicationScript以返回List ,其中每个字符串元素都是在GO语句中拆分的完整脚本的一部分。 这是必要的,因为GO是Management Studio使用的分隔符,而不是SQL语句

 public static List ConstructCreatePublicationScript(string rawPublicationScript, string rawAddArticleScript) { ..... List result = new List(); result.AddRange(Regex.Split(createPublicationScript, "^GO$", RegexOptions.Multiline)); return result; } 

然后更改执行代码以接收列表并执行每个单独的字符串

 public static void CreatePublication(string server, List queries) { string finalConnString = Properties.Settings.Default.rawConnectionString.Replace("<>", server).Replace("<>", "tempdb"); using (SqlConnection conn = new SqlConnection(finalConnString)) { conn.Open(); foreach(string query in queries) { using (SqlCommand cmd = new SqlCommand(query, conn)) { cmd.ExecuteNonQuery(); } } } } 

GO命令不是SQL命令,它是SQL Management Studio中的命令。 它在脚本中分隔批次。

要将脚本作为SQL运行,请将其拆分为"GO"并自行执行每个字符串。

(您可能希望使用像\bGO\b\sGO\s这样的正则表达式来进行拆分,这样您只能捕获不属于单词的出现,如果您碰巧有一个包含“go”的标识符”。)

读取文件。 当你遇到“GO”时,将查询提交给服务器(没有“GO”本身),然后继续阅读。