2012-02-06 31 views
0

どのようにタイプのテーブルを返すのですか?私は@Forumsテーブルを返すが、私はエラーを取得する必要がありますスカラーvaiable @Forumsを宣言する必要があります。私のコードのリターンC#のSQL戻り値

DECLARE @Forums Table 
(ForumGroup nvarchar(100), Title nvarchar(100), Description nvarchar(400), 
ThreadCount int, LastPostBy nvarchar(50), LastPostDate datetime, LastPostTtle nvarchar(100)) 
insert into @Forums 
SELECT ForumGroup = (
    CASE WHEN ParentID IS NOT NULL THEN 
     (SELECT Title FROM Forums WHERE ForumID = F.ParentID)   
    ELSE 
     (SELECT Title FROM Forums WHERE ParentID IS NULL) 
    END), 
Title, Description, 
ThreadCount = (SELECT COUNT(*) FROM Posts P WHERE P.ForumID = F.ForumID), 
LastPostBy = (SELECT TOP 1 AddedBy FROM Posts P WHERE P.ForumID = F.ForumID ORDER BY P.PostID DESC), 
LastPostDate = (SELECT TOP 1 AddedDate FROM Posts P WHERE P.ForumID = F.ForumID ORDER BY P.PostID DESC), 
LastPostTitle = (SELECT TOP 1 Title FROM Posts P WHERE P.ForumID = F.ForumID ORDER BY P.PostID DESC) 

FROM Forums F WHERE ParentID IS NOT NULL 

ORDER BY Title 
Return @Forums 

私は私のEDMXにストアドプロシージャ機能をインポートした後は何もありません:私はあなたがすべてで変数を必要とする理由が見当たらない

public class Forums 
{   
    public List<Forum> GetForums() 
    { 

     using (EntityConnection conn = new EntityConnection("name=CMSEntities")) 
     { 
      conn.Open(); 
      EntityCommand cmd = conn.CreateCommand(); 
      cmd.CommandText = "CMSEntities.sproc_Forums_GetForums"; 
      cmd.CommandType = System.Data.CommandType.StoredProcedure; 

      using (EntityDataReader reader = cmd.ExecuteReader(System.Data.CommandBehavior.SequentialAccess)) 
      { 
       List<Forum> forums = new List<Forum>(); 
       while (reader.Read()) 
       { 
        Forum forum = new Forum(
         1, 
         "", 
         DateTime.Now, 
         reader["Title"].ToString(), 
         reader["Description"].ToString(), 
         0, 
         false, 
         null, 
         null, 
         null, 
         true, 
         reader["ForumGroup"].ToString(), 
         1, 
         null, 
         DateTime.Now, 
         null); 
        forums.Add(forum); 
       } 
       return forums; 
      } 
     } 
    } 
} 
+0

SQLをヒットするために使用しているC#コードを提供できますか? –

+0

C#コードで変数テーブルを定義していますか?そうでない場合、[この記事](http://odetocode.com/code/365.aspx)は、コードの範囲内にないように思えます。多分、一時テーブルが良いでしょうか? –

+0

あなたは、C#のコード – ONYX

答えて

2
SELECT 
    ForumGroup = (
     CASE WHEN ParentID IS NOT NULL THEN 
      (SELECT Title FROM Forums WHERE ForumID = F.ParentID)   
     ELSE 
      (SELECT Title FROM Forums WHERE ParentID IS NULL) 
     END), 
    Title, 
    Description, 
    ThreadCount = (SELECT COUNT(*) FROM Posts P WHERE P.ForumID = F.ForumID), 
    LastPostBy = (SELECT TOP 1 AddedBy FROM Posts P WHERE P.ForumID = F.ForumID ORDER BY P.PostID DESC), 
    LastPostDate = (SELECT TOP 1 AddedDate FROM Posts P WHERE P.ForumID = F.ForumID ORDER BY P.PostID DESC), 
    LastPostTitle = (SELECT TOP 1 Title FROM Posts P WHERE P.ForumID = F.ForumID ORDER BY P.PostID DESC) 

FROM Forums F WHERE ParentID IS NOT NULL 

ORDER BY Title; 

。合法である実数列と計算列の組み合わせを選択しています。

例えば、私は、「X」の欄は、フォーラムのテーブルから来ないSELECT X = 1 FROM Forums;を言うことができるが、それは有効です。

あなたは、テーブル変数を使用したいん何らかの理由場合:最後に、あなたが受信したエラーメッセージがあなたの元の問題の原因を示し

SELECT * FROM @Forums; 

はスカラ変数を宣言する必要があります

テーブルはscalar値ではありません。ストアドプロシージャの実際の戻り値はスカラーでなければなりません(ストアドプロシージャは、SELECTには必要なデータがありますが、戻り値とは異なります)。

+0

私のedmxにストアドプロシージャをインポートした後、コードを実行しません – ONYX

+0

@KDM - SQL Management Studioでストアドプロシージャを実行すると、データが返されますか? –

0

ストアドプロシージャから「表」を返すことはできません。 RETURNの値は、単一の数値(スカラー)でなければなりません。ストアドプロシージャから複数の行を返すために

、あなたは、単に(変数の割り当てを行い1とは反対に)行を返すSELECTを実行します。 SELECTの行は、「結果セット」の形式でクライアントに戻され、読者から入手できます。だから、

、あなたの質問にコードを修正し、テーブル変数宣言、INSERT声明とRETURN文を削除し、ちょうどSELECTコールを実行します。

FWIW、あなたはまた、単に行を返す複数のSELECTを実行することで、ストアドプロシージャから複数の結果セットを返すことができます。