需要在数据库中多次插入数据行

时间:2015-12-31 08:25:37

标签: asp.net sql-server

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

的数据

表1根据数量进行4次。

<code>enter image description here</code>

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放在多个时间插入数据?

3 个答案:

答案 0 :(得分: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());
    }
}

我希望现在很清楚。 !

答案 1 :(得分:0)

正如评论中所指出的,在源表和目标表上没有主键的情况下复制行并不是一个好主意,否则行的识别将成为问题。

您还没有提到是要复制一行,多行还是整个表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;

答案 2 :(得分:0)

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

这是一个将从你的table1读取QTY的版本 它还将为表2中的数量插入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