使用存储过程批量插入/更新

时间:2010-10-09 07:25:02

标签: sql sql-server

有人能给我一个示例脚本,用于在SQL Server中使用存储过程批量插入/更新表中的记录吗?

2 个答案:

答案 0 :(得分:2)

我过去做过类似的事情:

CREATE PROCEDURE InsertProductIds(@ProductIds xml) AS

INSERT INTO Product (ID) 
SELECT ParamValues.ID.value('.', 'VARCHAR(20)')
FROM   @ProductIds.nodes('/Products/id') as ParamValues(ID) 

END

显然,这只是一个单列表,但XML方法也适用于多列表。然后你这样做:

EXEC InsertProductIds @ProductIds='<Products><id>3</id><id>6</id></Products>'

答案 1 :(得分:1)

发送表值参数是另一种选择。

SQL

CREATE TYPE TestTableType AS TABLE 
(
    ID INT,
    Name NVARCHAR(100), 
    Description NVARCHAR(2000)
);
GO
CREATE proc [dbo].[Test_Table_Parameter]
    @Tbl TestTableType READONLY
as
    SELECT 'Return'
GO

代码

var param = new SqlParameter();
    param.ParameterName = "@Tbl";
    param.SqlDbType = SqlDbType.Structured;
    var dt = new DataTable();
    var str = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + DateTime.Now;

    //map the fields to datatypes here
    dt.Columns.Add("ID", typeof (Int32));
    dt.Columns.Add("Name", typeof(string));
    dt.Columns.Add("Description", typeof(string));

    for (var i = 0; i < rows; i++)
    {
        dt.Rows.Add(new object[] {i + 1, (i + 1).ToString(), str });
    }

    param.Value = dt;

这些来自here,它也在SQL查询结束时查看了这个和xml方法的性能。

This着眼于数据传输端的性能。记住要记住的数据和来回传递的数据的大小,以及如何在查询中使用它来选择最佳方法。