zoukankan      html  css  js  c++  java
  • 使用表参数实现SQL Server 高性能写入

     

      如果,大家使用SQL Server 2008,它提供一个新的功能表变量(Table Parameters)可以将整个表数据汇集成一个参数传递给存储过程或SQL语句。它的注意性能开销是将数据汇集成参数(O(数据量))。

      现在,我们修改之前的代码,在SQL Server中定义我们的表变量,具体定义如下:

    -- =============================================
    -- Author:        JKhuang
    -- Create date: 08/16/2012
    -- Description:    Declares a user table paramter.
    -- =============================================
    CREATE TYPE jk_users_bulk_insert AS TABLE (
        user_login varchar(60),
        user_pass varchar(64),
        user_nicename varchar(50),
        user_email varchar(100),
        user_url varchar(100),
        user_activation_key varchar(60),
        user_status int,
        display_name varchar(250)
    )
    

      上面,我们定义了一个表参数jk_users_bulk_insert,接着我们定义一个存储过程接受表参数jk_users_bulk_insert,具体定义如下:

    -- =============================================
    -- Author:        JKhuang
    -- Create date: 08/16/2012
    -- Description:    Creates a stored procedure, receive
    -- a jk_users_bulk_insert argument.
    -- =============================================
    CREATE PROCEDURE sp_insert_jk_users 
    @usersTable jk_users_bulk_insert READONLY 
    AS
    INSERT INTO jk_users (user_login, user_pass, user_nicename, user_email, user_url, 
    user_activation_key, user_status, display_name, user_registered) 
    SELECT user_login, user_pass, user_nicename, user_email, user_url, 
    user_activation_key, user_status, display_name, GETDATE() 
    FROM @usersTable

      接下我们在客户端代码中,调用存储过程并且将表作为参数方式传递给存储过程。

    var sw = Stopwatch.StartNew();
    using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["SQLCONN2"].ToString()))
    {
        conn.Open();
        //// Invokes the stored procedure.
        using (var cmd = new SqlCommand("sp_insert_jk_users", conn))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            //// Adding a "structured" parameter allows you to insert tons of data with low overhead
            var param = new SqlParameter("@userTable", SqlDbType.Structured) { Value = dt };
            cmd.Parameters.Add(param);
            cmd.ExecuteNonQuery();
        }
    }
    sw.Stop();
  • 相关阅读:
    使用.Net Core 2.2创建windows服务
    Ubuntu 18.04 安装部署Net Core、Nginx全过程
    Task的在主线程处理异常信息的Helper类
    行转列的处理。
    netcore 下加密遇到的问题
    关于安装angular-cli环境报错的问题
    64位的windows服务安装问题
    EF.Mysql在codefirst模式下调用存储过程,和再DbFirst模式下的调用
    阿里云消息队列的C#使用http接口发送消息实例
    [转载]EF或LINQ 查询时使用IN并且根据列表自定义排序方法
  • 原文地址:https://www.cnblogs.com/maodan/p/3027761.html
Copyright © 2011-2022 走看看