我编写了一些C#来运行指定的SQL脚本,在GO批处理分隔符中分离命令并执行每个命令。这样就可以在应用程序的开头安装SQL对象。但是,我遇到了安装CLR程序集和函数的问题。
它将运行并创建CLR程序集OK,但是当它尝试创建函数时它返回错误:
关键字“FUNCTION”附近的语法不正确。 关键字“AS”附近的语法不正确。
我已尝试在SSMS中直接使用脚本创建程序集和函数,并且运行正常。在SSMS中创建程序集之后,我还在C#中运行了函数脚本,运行正常。如果两个脚本都通过C#运行,它似乎似乎没有创建函数。
执行SQL脚本的C#代码:
var fileInfo = new FileInfo(sqlDirectory + "\\" + fileName);
var script = fileInfo.OpenText().ReadToEnd();
if (!String.IsNullOrEmpty(script))
{
string sqlBatch = string.Empty;
script += "\nGO";
try
{
foreach (
string line in
script.Split(new string[2] {"\n", "\r"},
StringSplitOptions.RemoveEmptyEntries))
{
if (line.ToUpperInvariant().Trim() == "GO")
{
if (sqlBatch != "")
{
cmd.CommandType = CommandType.Text;
cmd.CommandText = sqlBatch;
cmd.ExecuteNonQuery();
sqlBatch = string.Empty;
}
}
else
{
sqlBatch += line + "\n";
}
}
fileInfo.OpenText().Close();
}
catch (Exception err)
{
var context = HttpContext.Current;
Global.InstallError = "File Name: " + fileName + "<br/>" +
"Error: " + err.Message;
}
}
CLR功能:
/****** Object: UserDefinedFunction [dbo].[fn_JSON_FormatArray] Script Date: 03/07/2013 11:52:18 ******/
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
CREATE FUNCTION [dbo].[fn_JSON_FormatArray](@value [xml], @label [nvarchar](4000))
RETURNS [xml] WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [CLRExtensions].[UserDefinedFunctions].[fn_JSON_FormatArray]
GO
EXEC sys.sp_addextendedproperty @name=N'SqlAssemblyFile', @value=N'JSON\fn_JSON_FormatArray.cs' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'FUNCTION',@level1name=N'fn_JSON_FormatArray'
GO
EXEC sys.sp_addextendedproperty @name=N'SqlAssemblyFileLine', @value=N'11' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'FUNCTION',@level1name=N'fn_JSON_FormatArray'
GO
答案 0 :(得分:0)
我现在已经解决了这个问题。问题结果是我以后使用相同的SQLCommand来执行存储过程(因为我给命令一个SQLTransaction,所以我可以在它失败时回滚)并且忘记删除我运行时添加的参数下一个文本命令。因此,它正在运行第一个脚本文件,然后失败。