【问题标题】:Store multiple values from SELECT statement and then insert into different table从 SELECT 语句中存储多个值,然后插入到不同的表中
【发布时间】:2018-02-17 22:21:20
【问题描述】:

我想使用 SELECT 语句到基于 ListBox 中的多个值的表中并获取多个 ID,然后运行 ​​INSERT 语句并将多个 ID 存储到来自 INSERT 语句的不同表中。

下面的代码不起作用,因为我在单行中得到“NULL”,而不是在多行中得到多个 ID。

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

请看我下面的代码:

我的 ASPX 网页的代码隐藏:

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 ('+@spselectvalue +')

EXEC sp_executesql @Dis

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

【问题讨论】:

  • @Dis 是否包含您期望的数据?

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


【解决方案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# 端将您的数据绑定到存储过程。要绑定它,你必须先将数据存储在一个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();

【讨论】:

    【解决方案2】:

    这似乎不是一个有效(或逻辑)的 SQL。 exec sp_executesql @Dis 不应该在那里,@Dis 不应该是一张桌子。

    当使用sp_executesql 时,参数应该是包含要执行的语句的字符串 (documentation)。

    详细答案可以在here找到。

    另外:INSERT INTO @Dis ... 行在以这种方式编写时不会像您预期的那样工作,原因在链接问题中提到(以及那里提到的 Erland Sommarskog 博客)。

    【讨论】:

      【解决方案3】:

      选定的值被视为数字。

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

      【讨论】:

        猜你喜欢
        • 2016-05-29
        • 1970-01-01
        • 2020-09-29
        • 1970-01-01
        • 1970-01-01
        • 2016-05-29
        • 1970-01-01
        • 2017-08-24
        • 1970-01-01
        相关资源
        最近更新 更多