在C#中安装SQL对象 - 在安装CLR程序集和函数脚本时出现问题

时间:2013-08-08 15:55:37

标签: c# sql-server tsql sqlclr

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

1 个答案:

答案 0 :(得分:0)

我现在已经解决了这个问题。问题结果是我以后使用相同的SQLCommand来执行存储过程(因为我给命令一个SQLTransaction,所以我可以在它失败时回滚)并且忘记删除我运行时添加的参数下一个文本命令。因此,它正在运行第一个脚本文件,然后失败。