2

我正在尝试开发一个将运行 CREATE PROCEDURE 脚本的小应用程序。一个简单的例子:

IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = 'ap_get_roles_in_system')
    BEGIN
        DROP  Procedure  [dbo].[ap_get_roles_in_system]
    END

GO

CREATE PROCEDURE [dbo].[ap_get_roles_in_system]
(
    @system_id int
)
AS
    SELECT * FROM roles

GO

GRANT EXEC ON [dbo].[ap_get_roles_in_system] TO PUBLIC

GO

如果我将此文本加载到一个字符串中,并通过 ExecuteNonQuery() 运行它,则删除存储过程的第一个项目可以正常工作,但不是运行 Create,而是使用存储的参数发现语法错误程序,即:尚未声明。

简而言之,它不是尝试运行 CREATE,而是以某种方式尝试将脚本作为脚本运行,而不是 CREATE。不知道正确的措辞是什么。

如果粘贴到 Sql Management Studio 中,上面的脚本效果很好。

这是我正在执行的代码:

public string RunSql(string Sql)
{
    string result = string.Empty;

    _conn.Open();
    SqlCommand cmd = new SqlCommand(Sql, _conn);
    cmd.CommandType = CommandType.Text;

    try
    {
        cmd.ExecuteNonQuery();

        result = "Succeeded";
    }
    catch (SqlException ex)
    {
        result = ex.Message;
    }

    return result;
}
4

2 回答 2

4

@RichardSchneider 的回答让我找到了我找到的解决方案,但我想在这么晚的时候,因为有很多观点,我应该发布解决问题的代码,理查德的回答让我知道。这是一个名为 SqlAction 的整个类。注意,我用“GO”分割了整个文本,然后将组件放入一个数组中,依次执行每个组件:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;

namespace SProcRunner
{
    public class SqlAction
    {
        public SqlAction(string connString)
        {
            SqlConnectionStringBuilder sb = new SqlConnectionStringBuilder(connString);

            _conn = new SqlConnection(sb.ToString());
        }

        private SqlConnection _conn;

        public string RunSql(string Sql)
        {
            string result = string.Empty;

            // split the sql by "GO"

            string[] commandText = Sql.Split(new string[] { String.Format("{0}GO{0}", Environment.NewLine) }, StringSplitOptions.RemoveEmptyEntries);

            _conn.Open();
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = _conn;
            cmd.CommandType = CommandType.Text;

            for (int x = 0; x < commandText.Length; x++)
            {
                if (commandText[x].Trim().Length > 0)
                {
                    cmd.CommandText = commandText[x];
                    try
                    {
                        cmd.ExecuteNonQuery();
                        result = "Command(s) completed successfully.";
                    }
                    catch (SqlException ex)
                    {
                        result = String.Format("Failed: {0}", ex.Message);
                        break;
                    }
                }
            }

            if (_conn.State != ConnectionState.Closed) _conn.Close();

            return result;
        }
    }
}
于 2015-01-17T00:38:34.317 回答
2

从 SQL 中删除“GO”行。

于 2013-02-07T18:22:03.187 回答