我编写了一些 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