我想通过ADO.NET使用我的ASP.NET网站运行我的.sql脚本文件。怎么可能不起作用?
当我尝试
时'dbScript is a string and contains contents of the .sql file'
Dim cmd As New SqlCommand(dbScript, con)
Try
con.Open()
cmd.ExecuteNonQuery()
Catch ex As Exception
Finally
con.Close()
cmd.Dispose()
End Try
在脚本中执行GO语句时出现异常。我该如何解决这个问题?
答案 0 :(得分:14)
请参阅我关于Handling GO Separators in SQL - The Easy Way的博文。诀窍是使用SMO's ExecuteNonQuery()方法。例如,这里有一些代码将运行目录中的所有脚本,而不管GO分隔符:
using System;
using System.IO;
using System.Data.SqlClient;
using System.Collections.Generic;
//Microsoft.SqlServer.Smo.dll
using Microsoft.SqlServer.Management.Smo;
//Microsoft.SqlServer.ConnectionInfo.dll
using Microsoft.SqlServer.Management.Common;
public class RunAllSqlSriptsInDirectory
{
public static void Main()
{
string scriptDirectory = "c:\\temp\\sqltest\\";
string sqlConnectionString = "Integrated Security=SSPI;" +
"Persist Security Info=True;Initial Catalog=Northwind;Data Source=(local)";
DirectoryInfo di = new DirectoryInfo(scriptDirectory);
FileInfo[] rgFiles = di.GetFiles("*.sql");
foreach (FileInfo fi in rgFiles)
{
FileInfo fileInfo = new FileInfo(fi.FullName);
string script = fileInfo.OpenText().ReadToEnd();
SqlConnection connection = new SqlConnection(sqlConnectionString);
Server server = new Server(new ServerConnection(connection));
server.ConnectionContext.ExecuteNonQuery(script);
}
}
}
答案 1 :(得分:7)
GO不是Transact-SQL语句,是工具批处理分隔符。在批处理中遇到GO时,服务器正确地抱怨语法错误。您需要将文件拆分为批次,然后执行单个批次。使用正则表达式将文件分批批处理并在单行上识别GO不区分大小写。
答案 2 :(得分:3)
使用拆分方法执行批处理存在一个小问题。问题是评论。假设您对文件内容没有任何权力。你只需要执行它。在多行注释中的GO将是这里的每个解决方案示例中的问题,即使用“GO”作为分隔符来拆分sql代码。例如:
[some sql code]
GO
/* start of commented out sql code ***********
[some sql code]
GO
end of commented out sql code ****************/
[some sql code]
GO
这需要一些比分割更复杂的解析。这将不再适用:
Regex regex = new Regex("^GO", RegexOptions.IgnoreCase | RegexOptions.Multiline);
string[] lines = regex.Split(sql);
此代码也忽略了空格可能导致GO。
答案 3 :(得分:2)
这是因为GO实际上不是本机TSQL语句,它在Management Studio / Enterprise Manager中用于将脚本分成批次。
您需要:
1)在每个GO语句上将其拆分为多个单独的脚本
2)在SQL管理对象中使用Server类,例如here
答案 4 :(得分:0)
您必须进行两次解析。第一次传递是删除所有注释并构建一个新字符串。第二步是使用基于GO关键字的REGEX拆分。