1

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

1 回答 1

0

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

于 2013-08-09T09:15:17.957 回答