web-dev-qa-db-ja.com

SQL Serverのストアドプロシージャから複数のデータセットを返す

5つの異なるクエリを実行するストアドプロシージャの呼び出しに基づくBase64 XML出力をWeb APIを介して返す必要があります。

ストアドプロシージャは記述されていません(書き込む必要があります)が、データが完全に異なるテーブルや列などのクエリが5つあるので、これが可能かどうか疑問に思っていますか?

Oracleでは複数のカーソルを返すことができますが、SQL Serverでは、asp.net 4.5(mvc c#/ Ado.net)に複数のデータセットまたはコレクションを返すことができますか?この例はありますか?

クエリの1つだけの例

   -- Content Tab
SELECT -- vTC.[TemplateId]  
  t.Name as "Client Name and Document"  ,vTC.[SectionName] ,vTC.[ContentId] ,vTC.[ContentName]
  ,vTC.[ContentDescription],vTC.[ContentValue] ,CAL.ContentValue as "Spanish Content" , iif(S.IsClientSection = 1, 'Global Section','Template Section') as "Global or Template Section"
  ,DT.Title as DataType ,iif(vTC.IsRequired = 1, 'Yes', 'No') as "Required" ,vTC.[DisplayType] 
FROM [dbo].[vwTemplateContent] vTC
 left join dbo.Template t on vTC.TemplateId = t.TemplateId
  left join dbo.DataType DT on vTC.DataTypeId = dt.datatypeid
   left join dbo.Section S on S.SectionID = vTC.SectionID
   left join [dbo].[ContentAlternateLanguage] CAL on vTC.ContentId =    CAL.ContentID
  where vTC.templateid in (1) 
  order by DisplayOrder
8
user6321478

複数のテーブルを取得する場合は、以下のように、ストアドプロシージャに複数の選択ステートメントを記述する必要があります。

CREATE PROCEDURE SPName
(
/*Declare your parameters*/
@parm1 dataType
)
AS
BEGIN
/*Write your select statements below*/
-- SELECT * FROM tblName
-- SELECT * FROM tblName2

END

これらのレコードをDataSetに入力する必要があります DataSet はADO.netへの複数のテーブルをサポートします。

以下のコードを参照して、DataSetに入力してください。

SqlConnection con=new SqlConnection("YourConnection String");
SqlCommand cmd=new SqlCommand();
SqlDataAdapter da=new SqlDataAdapter();
DataSet ds = new DataSet();
cmd = new SqlCommand("SPName", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@parm1", id);//if you have parameters.
da = new SqlDataAdapter(cmd);
da.Fill(ds);
con.Close();

この後、次を使用してさまざまな複数のレコードセットを利用できます

ds.Tables[0]
ds.Tables[1]
..

それがあなたを助けることを願っています

ありがとう

15
Sunil Kumar

基本的な例は次のとおりです。

SQLプロシージャ:

CREATE PROCEDURE usp_getStudentsAndClasses
    @ClassName      varchar(50)
,   @IsActive       bit
AS
BEGIN
    --First select is first table
    SELECT  *
    FROM    Students

    --Second select is second table, etc.
    SELECT  *
    FROM    Classes

    --Third table...
    --Can be more complex, as long as there is a result set
    SELECT  s.FirstName
    ,       s.LastName
    FROM    Students            s
    JOIN    StudentSeating      ss
    ON      s.StudentID     =   ss.StudentID
    JOIN    Classes             c
    ON      c.ClassID       =   ss.ClassID
    WHERE   s.IsActive      =   @IsActive
    AND     c.Name          =   @ClassName

END

C#関数:

    public DataSet GetDataSet(SqlConnection connection, string storedProcName, params SqlParameter[] parameters)
    {
        var command = new SqlCommand(storedProcName, connection) { CommandType = CommandType.StoredProcedure };
        command.Parameters.AddRange(parameters);

        var result = new DataSet();
        var dataAdapter = new SqlDataAdapter(command);
        dataAdapter.Fill(result);

        return result;
    }

C#の使用法:

        var connection = new SqlConnection("Your_connection_string");
        var parameters = new SqlParameter[]
        {
            new SqlParameter("ClassName", "Robotics"),       //example of string value
            new SqlParameter("IsActive", true)               //example of numeric value
        };
        var dataSet = GetDataSet(connection, "usp_getStudentsAndClasses", parameters);

        var firstTable = dataSet?.Tables?[0];   //use as any other data table...

返されるデータ型がDataSetではなくDataTableであることを除いて、単一テーブルストアドプロシージャに使用するコードとほぼ同じです。 DataSetにはDataTableCollectionが含まれています MSDNの詳細

3
CoolBots

はい、可能です。選択クエリを記述するだけで、データをDataSetに取得できます。単一の選択クエリがある場合はDataTableを取得し、選択クエリの数が多い場合(たとえば5)、5つのDataSetsを含むDataTableを取得します。とても簡単です。手順を書いて楽しんでください。

編集:ストアドプロシージャ(疑似コード)の例を以下に示します。

create Proc Name_Of_Proc
(
   @FirstParam DataType,
   @SecondParam DataType
)
AS
Begin
   Select statement 1
   Select statement 2 
   Select statement 3 --and so on upto n.
end

データベースでこれを行う必要があります。これを実行した後、ADO.NETを使用してc#からこのプロシージャを実行する必要があります。これを行うには、SqlConnectionSqlCommandおよびSqlDataReaderオブジェクトを使用する必要があります。グーグルまたはSO自体の例については、それ自体を検索できます。SOは、このようなリンクの1つです c#でストアドプロシージャを実行する方法

1
vivek