我有一个包含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 .... ;
答案 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)
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