2

CREATEPROCEDUREスクリプトを実行する小さなアプリを開発しようとしています。簡単な例:

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ではなくスクリプトとしてスクリプトを実行しようとしているのです。正しい言い回しが何であるかわからない。

上記のスクリプトは、SQLManagementStudioに貼り付けるとうまく機能します。

これが私が実行しているコードです:

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の答えが私を見つけた解決策に導きましたが、非常に多くの意見があったので、この遅い日付で、問題を解決するコードを投稿する必要があると思いました。Richardの答えが私を導きました。これが、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 に答える