2

私は単純なストアドプロシージャを持っています

CREATE PROCEDURE [dbo].[simple]

AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    DECLARE @sql NVARCHAR(MAX)

    SELECT @sql = '
            SELECT TOP(5) * FROM aTable'
        PRINT @sql

    EXEC sp_executesql 
        @sql
END

そして今、C#で、可能であれば@sqlストアドプロシージャから値を取得したい(実行後)。

SQL Server 2005 を使用しています。

C#でそれを行う方法は?

4

4 に答える 4

3

SPROCから明示的に返す必要があります。

あなたは少なくとも持っています3ここに2つのオプション

  1. OUTパラメータ(CREATE PROCEDURE [dbo].[simple] @sql NVARCHAR(MAX) OUT
  2. RETURNRETURN @sql
  3. SELECT @sqlSPROCの最後の行と同じように

次に、これをC#コードの適切なテクノロジーにバインドする必要があります

EDITリターンは機能しません-整数式のみ

Re:C#でこれを行うにはどうすればよいですか?

ADO.NETSqlClientを使用していると仮定します。

OUTPUTを使用する場合

var myParam = new SqlParameter("@sql", SqlDbType.VarChar);
myParam.Direction = ParameterDirection.Output;
myCmd.Parameters.Add(myParam);

SELECTを使用すると、SPROCへの追加の結果セットとして取得されます。procはすでに1つの結果セット('sp_executesql @sql'による)を発行しているため、これは2番目になります。

于 2012-08-30T09:14:34.580 に答える
3

コメントから、メソッドを呼び出した後に@sqlC# コードからアクセスする必要があります。そう:

CREATE PROCEDURE [dbo].[simple]
    @sql nvarchar(4000) = null OUTPUT
AS
BEGIN
    SET NOCOUNT ON;

    SELECT @sql = N'SELECT TOP(5) * FROM aTable'

    EXEC sp_executesql @sql
END

次に、単純に ADO.NET コードで次のようにします。

using(var cmd = connection.CreateCommand()) {
    cmd.CommandText = "dbo.simple";
    cmd.CommandType = CommandType.StoredProcedure;
    var sqlParam = cmd.Parameters.Add("sql", SqlDbType.NVarChar, 4000);
    sqlParam.Direction = ParameterDirection.Output;
    // TODO here: ExecuteNonQuery, ExecuteReader, etc, i.e. your existing code
    string sql = (string)sqlParam.Value;
}
于 2012-08-30T09:23:28.863 に答える
1

なぜこれを使用しないのですか、@sql変数の必要性は何ですか:

CREATE PROCEDURE [dbo].[simple]
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    SELECT TOP(5) * FROM aTable
END

C# コード:

    SqlConnection sqlConnection = new SqlConnection("ConnectionString"); 
    SqlCommand cmd = new SqlCommand("simple", sqlConnection);
    cmd.CommandType = CommandType.StoredProcedure;
    SqlDataAdapter adp = new SqlDataAdapter(cmd);
    DataSet ds = new DataSet();
    adp.Fill(ds);
于 2012-08-30T09:22:06.150 に答える
0

SqlCommandクラスには、「データ ソースで実行する Transact-SQL ステートメント、テーブル名、またはストアド プロシージャを取得または設定する」プロシージャを読み取るために使用できる CommandText プロパティがありますここでいくつかの例を見つけることができます。

于 2012-08-30T09:17:49.337 に答える