从SELECT语句存储多个值,然后插入到不同的表中

时间:2017-09-08 23:39:43

标签: c# sql asp.net stored-procedures

我希望基于ListBox中的多个值将SELECT语句用于表中并获取多个ID,然后运行INSERT语句并将多个ID存储到{{1}的不同表中声明。

我的代码无效,因为我得到了" NULL"单行而不是多行中的多个ID。

我正在为所有SQL语句使用存储过程。

请参阅下面的代码:

我的ASPX网页的代码隐藏:

INSERT

存储过程:

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);

3 个答案:

答案 0 :(得分: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的存储过程。要绑定它,您必须先将数据存储在DataTable中,这相对容易:

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();

答案 1 :(得分:0)

这似乎不是一个有效的(或逻辑的)SQL。 * Initialized password authentication * Authentication complete * Failed to close libssh2 file 不应该在那里,或exec sp_executesql @Dis不应该是一张桌子。

使用@Dis时,参数应该是包含要执行的语句的字符串(enter image description here)。

可以找到详细答案documentation

另外:由于链接问题中提到的原因(以及那里提到的Erland Sommarskog博客),sp_executesql行在按此方式编写时无法正常工作。

答案 2 :(得分:0)

选定的值视为数字。

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

EXEC sp_executesql @Sqltext