【问题标题】:Need to insert a data row multiple times in the database需要在数据库中多次插入数据行
【发布时间】:2015-12-31 19:58:49
【问题描述】:

我在 sql 中有两个数据表。我需要将数据从一张表插入到另一张表中。我的第一个数据表 Table1 包含数据列 Code,Model,Num,Qty 和第二个表 Table2 也包含相同的。但是我需要将table1中的数据多次插入到table2中。如果 Table1 中的 Qty 为 4 则插入

的数据

Table1 按数量分4次。

protected void Button15_Click3(object sender, EventArgs e)
{
     for (int i = 0; i < 4; i++)
     {
          String str1 = "insert into Table2(Code, Model, Num, Qty) select Code, Model, Num, Qty from Table1;";

          SqlCommand xp1 = new SqlCommand(str1, con);
          con.Open();

          SqlDataAdapter da1 = new SqlDataAdapter();
          da1.SelectCommand = xp1;

          DataSet ds1 = new DataSet();
          da1.Fill(ds1, "Code");

          GridView1.DataSource = ds1;
          con.Close();
      }
   }
}

在这个程序中,我手动给出了数字 4,但我需要从我的数据库 qty 中获取它。如何将 SQL 列名 qty 放入循环中多次插入数据?

【问题讨论】:

  • 这可能不是一个好主意。数据库表中的行应包含唯一值。
  • 只需在插入循环之前通过执行选择查询来选择数量,然后获取数量。!我希望这很清楚。!
  • @Kunal Kakkad 你能解释一下吗

标签: asp.net sql-server


【解决方案1】:

你可以这样试一试:

private void button1_Click(object sender, EventArgs e)
{
    string connetionString = null;
    SqlConnection connection ;
    SqlDataAdapter adapter = new SqlDataAdapter();
    DataSet ds = new DataSet();
    int i = 0;
    int j = 0;
    connetionString = "Data Source=ServerName;Initial Catalog=DatabaseName;User ID=UserName;Password=Password";
    connection = new SqlConnection(connetionString);
    try
    {
        connection.Open();
        adapter.SelectCommand = new SqlCommand("Your SQL Statement Here", connection);
        adapter.Fill(ds);
        connection.Close();
        for(j=0;j<=ds.Tables[0].Rows.Count;j++){
            for (i = 0; i <= Convert.ToInt32(ds.Tables[0].Rows[j]["Qty"].ToString()); i++)
            {
                String str1 = "insert into Table2(Code, Model, Num, Qty)
                            select Code, Model, Num, Qty from Table1;";
                SqlCommand xp1 = new SqlCommand(str1, con);
                con.Open();

                SqlDataAdapter da1 = new SqlDataAdapter();
                da1.SelectCommand = xp1;

                DataSet ds1 = new DataSet();
                da1.Fill(ds1, "Code");

                GridView1.DataSource = ds1;
                con.Close();

            }
        }

    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}

我希望现在很清楚。 !

【讨论】:

  • 抱歉耽搁了。先生,我已经执行并更改了几次代码。它显示了这个错误。所以我将行更改为 //for (i = 1; i
【解决方案2】:

正如 cmets 中所指出的,如果源表和目标表上都没有主键,则复制行不是一个好主意,否则行的标识将成为问题。

您还没有提到是要复制一行、多行还是整个表 N 次,但假设是后者,像这样的批量 IO 作业更适合在数据库服务器内执行整个操作,以减少您的应用程序和数据库之间来回传输数据的 IO。

假设两个表都在同一个数据库中,您可以使用行复制递归 CTE 来执行此操作。如果你需要从 C# 中控制@CopyCount,只需将其绑定为整数并使用SqlCommand.ExecuteNonQuery 执行即可:

DECLARE @CopyCount INT = 10;
with cteRowGen AS
(
    SELECT 1 AS RowNum

    UNION ALL

    SELECT RowNum + 1
    FROM cteRowGen
    WHERE RowNum < @CopyCount
)
insert into Table2(Code,Model,Num,Qty)
    select Code,Model,Num,Qty
        from table1 CROSS JOIN cteRowGen;

【讨论】:

    【解决方案3】:

    就像 StuartLC 指出的那样,CTE 是要走的路。

    这是一个可以从您的 table1 中读取 QTY 的版本 它还将为 Table2 中的数量插入 1,而不是 4

    DECLARE @Cnt    INT = (SELECT Qty FROM Table1);
    
    WITH data AS (
        SELECT 1 AS RowCnt
        UNION ALL
        SELECT RowCnt + 1
        FROM data
        WHERE RowCnt < @Cnt
    )
    
    INSERT INTO Table2
    SELECT Code, Model, Num, 1 as Qty
    FROM Table1 a
        CROSS JOIN data
    

    【讨论】:

    • 你把上面的代码做一个存储过程,然后从你的代码中调用这个存储过程。网上应该有很多关于如何做到这一点的信息
    猜你喜欢
    • 1970-01-01
    • 2019-01-28
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多