如何基于Go word忽略和拆分sql命令

时间:2015-12-29 18:24:44

标签: sql-server vb.net string split

我有一个包含several SQL Commands的脚本。由于我需要逐个拆分命令,我使用go字来创建批处理。

Dim script = "SELECT * FROM TABLEX; " _
             & "go " _
             & "----- some coment that includes go word like ago " _
             & "INSERT INTO TABLEX .... ;" _
             & "go "
For Each sqlBatch As String In script.Split(New String() {"GO", "Go", "go"}, StringSplitOptions.RemoveEmptyEntries)
   'use sqlBatch 
Next

如果脚本有注释它可以正常工作,但是当它恰好有go字样"ago"时,该指令会破坏字符串和sql抛出错误,例如在我将得到的示例中:

SELECT * FROM TABLEX;
----- some coment that includes 
 word like a
INSERT INTO TABLEX .... ;

这显然不是我想要的,如何使用Split来避免评论,并且不会对这些包含案例的go字段失败? 所以我得到了:

SELECT * FROM TABLEX;
INSERT INTO TABLEX .... ;

3 个答案:

答案 0 :(得分:2)

您可以使用Sql Server Management objects库。这个库中的对象不会被命令之间的GO分隔符欺骗,您可以使用单个ExecuteNonQuery提交脚本

Imports Microsoft.SqlServer.Management.Common
Imports Microsoft.SqlServer.Management.Sdk.Sfc
Imports Microsoft.SqlServer.Management.Smo
Imports System.Collections.Specialized

' Read the script. It is important to use a StringCollection'
Dim cmd = File.ReadAllText("d:\temp\create.sql")
Dim col = new StringCollection()
col.Add(cmd)

Using con = new SqlConnection(".....")
    Dim svrConnection = new ServerConnection(con)
    Dim server = new Server(svrConnection)
    server.ConnectionContext.ExecuteNonQuery(col)
End Using

要使此代码正常工作,您需要安装Sql Server管理对象库并添加所需的引用和Imports语句

Microsoft.SqlServer.ConnectionInfo.dll
Microsoft.SqlServer.Smo.dll
Microsoft.SqlServer.Management.Sdk.sfc.dll

答案 1 :(得分:2)

使用ststeiger

中的ScriptSplitter课程完成课程
Dim script = "SELECT * FROM TABLEX; " _
             & Environment.NewLine & "go " _
             & Environment.NewLine & "----- some coment that includes go word like ago " _
             & Environment.NewLine & "INSERT INTO TABLEX .... ;" _
             & Environment.NewLine & "go "
Dim scs As New Subtext.Scripting.ScriptSplitter(script)
For Each str As String In scs
    Console.WriteLine(str)
Next

答案 2 :(得分:0)

不在我的开发机器上,但我认为这样可行:

    For Each sqlBatch As String In script.Split(New String() 
{environment.newline+"GO", 
environment.newline+"Go", 
environment.newline+"go", 
StringSplitOptions.RemoveEmptyEntries)
   'use sqlBatch