2017-09-08 9 views
0

SELECTステートメントをListBoxの複数の値に基づいてテーブルに入れ、複数のIDを取得してからINSERTステートメントを実行して複数のIDを別のテーブルINSERTステートメントから。SELECTステートメントから複数の値を格納して別のテーブルに挿入する

複数行の複数のIDではなく、単一の行に「NULL」が表示されるため、以下のコードが機能しません。

私はすべてのSQL文に対してストアドプロシージャを使用しています。

以下の私のコードを参照してください:私のASPX Webページの

コードビハインドを:

string listboxvalue = ""; 

foreach (ListItem item in listbox.Items) 
{ 
    if (item.Selected) 
    { 
     listboxvalue += item.Text + ','; 
    } 
} 

listboxvalue = listboxvalue.Substring(0, listboxvalue.Length - 1); 
cmd.Parameters.AddWithValue("spselectvalue", listboxvalue); 

ストアドプロシージャ:

@spselectvalue nvarchar(MAX), 

// Select multiple Ids based on multiple items from list box 

DECLARE @Dis TABLE (DisID int) 

INSERT INTO @Dis 
    SELECT DId 
    FROM [table name] 
    WHERE [COLUMN] IN ('[email protected] +') 

EXEC sp_executesql @Dis 

// Insert multiple Ids (from above select statement) into different table 
INSERT INTO [dbo].[DifferentTable] ([SelectedIds]) 
VALUES 
(
    (SELECT DisID from @Dis) 
) 
+0

@Disにはあなたが期待するデータが含まれていますか? – TheRuler

答えて

0

有効なように見えるしていません(または論理)SQL。 exec sp_executesql @Disは存在しないか、@Disはテーブルであってはなりません。

sp_executesqlを使用する場合、パラメータは実行する文を含む文字列(documentation)でなければなりません。

詳細な回答はhereです。

また、INSERT INTO @Dis ...行は、リンクされた質問(およびそこに記載されているErland Sommarskogブログ)に記載されている理由から、あなたがそのように書いたときに期待通りに動作しません。

1

IDのリストを処理するストアドプロシージャにどのように取得するのかわからないという問題があるようです。うまくいけば、この例が役に立ちます。このようにすれば、コンマ区切り文字列や動的SQLを混乱させる必要はありません。

まず、IDのリストを含めることができるSQLタイプを定義します。

CREATE TYPE dbo.MyList 
AS TABLE 
(
    ID VarChar(50) 
); 

すると、その入力パラメータとしてこのタイプを受け入れるストアドプロシージャ記述:バインドに

CREATE PROCEDURE dbo.InsertAList 
    @List AS dbo.MyList READONLY 
AS 
BEGIN 
    SET NOCOUNT ON; 

    INSERT INTO [dbo].[DifferentTable] 
    SELECT ID FROM @List 
END 

をあなたのデータをC#endからストアドプロシージャに渡します。

var table = new DataTable(); 
table.Columns.Add("ID", typeof(string)); 
foreach (ListItem item in listBox.Items.Where(i => i.Selected)) 
{ 
    table.Rows.Add(item.Text); 
} 

は、そのようにように、ストアドプロシージャにテーブルを提出する:

var cmd = new SqlCommand() 
    { 
     CommandType = CommandType.StoredProcedure, 
     CommandText = "InsertAList", 
     Connection = myConnection 
    }; 
cmd.Parameters.Add(new SqlParameter("@List", SqlDbType.Structured) 
    { 
     TypeName = "dbo.MyList", 
     Value = table 
    }); 
cmd.ExecuteNonQuery(); 
0

選択された値を数値として考え、それをバインドするには、比較的容易である、最初のDataTableにデータを格納する必要があります。

DECLARE @Sqltext nvarchar(max) = 
'INSERT INTO [dbo].[DifferentTable] ([SelectedIds]) 
SELECT DId 
FROM [table name] 
WHERE [COLUMN] IN (' + @spselectvalue + ')' 

EXEC sp_executesql @Sqltext 
関連する問題