sql插数据语句_sql语句批量添加数据

sql插数据语句_sql语句批量添加数据INSERTVALUES插入一行或多行到目标表中–singlerowINSERTINTOSales.MyOrders(custid,empid,orderdate,shipcount

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

INSERT VALUES

插入一行或多行到目标表中

-- single row
INSERT INTO Sales.MyOrders(custid, empid, orderdate, shipcountry, freight)
  VALUES(2, 19, '20120620', N'USA', 30.00);

-- relying on defaults
INSERT INTO Sales.MyOrders(custid, empid, shipcountry, freight)
  VALUES(3, 11, N'USA', 10.00);

INSERT INTO Sales.MyOrders(custid, empid, orderdate, shipcountry, freight)
  VALUES(3, 17, DEFAULT, N'USA', 30.00);

-- multiple rows
INSERT INTO Sales.MyOrders(custid, empid, orderdate, shipcountry, freight) VALUES
  (2, 11, '20120620', N'USA', 50.00),
  (5, 13, '20120620', N'USA', 40.00),
  (7, 17, '20120620', N'USA', 45.00);

注:如果要更新自增字段需要把IDENTITY_INSERT选项开启,用完后记得关闭

SET IDENTITY_INSERT <table> ON;

 

INSERT SELECT

把select 语句的查询结果插入到表中,这个中方法要比上面的INSERT VALUES 效率高

SET IDENTITY_INSERT Sales.MyOrders ON;

INSERT INTO Sales.MyOrders(orderid, custid, empid, orderdate, shipcountry, freight)
  SELECT orderid, custid, empid, orderdate, shipcountry, freight
  FROM Sales.Orders
  WHERE shipcountry = N'Norway';

SET IDENTITY_INSERT Sales.MyOrders OFF;

 

INSERT EXEC

该语句可以让你把动态语句或者存储过程的结果插入表格。

-- create procedure
IF OBJECT_ID(N'Sales.OrdersForCountry', N'P') IS NOT NULL
  DROP PROC Sales.OrdersForCountry;
GO

CREATE PROC Sales.OrdersForCountry
  @country AS NVARCHAR(15)
AS

SELECT orderid, custid, empid, orderdate, shipcountry, freight
FROM Sales.Orders
WHERE shipcountry = @country;
GO

-- insert the result of the procedure
SET IDENTITY_INSERT Sales.MyOrders ON;

INSERT INTO Sales.MyOrders(orderid, custid, empid, orderdate, shipcountry, freight)
  EXEC Sales.OrdersForCountry
    @country = N'Portugal';

SET IDENTITY_INSERT Sales.MyOrders OFF;

对于动态SQL,或者类似DBCC这种非常规的SQL语句,都可以通过这种方式来保存结果集。

CREATE TABLE test_dbcc
    (
      TraceFlag VARCHAR(100) ,
      Status TINYINT ,
      Global TINYINT ,
      Session TINYINT
    )

INSERT  INTO test_dbcc
        EXEC ( 'DBCC TRACESTATUS'
            )

注:不能嵌套使用insert exec语句 ,可以用以下方式变动(这里直接拷贝参考文章中的内容。我没试验过)

1.首先到打开服务器选项Ad Hoc Distributed Queries

exec sp_configure 'show advanced options',1
RECONFIGURE
GO
exec sp_configure 'Ad Hoc Distributed Queries',1
RECONFIGURE
GO

2. 通过OPENROWSET连接到本机,运行存储过程,取得结果集

--使用Windows认证
SELECT  *
INTO    #JobInfo_S1
FROM    OPENROWSET('sqloledb', 'server=(local);trusted_connection=yes',
                   'exec msdb.dbo.sp_help_job')

--使用SQL Server认证
SELECT  *
INTO    #JobInfo_S2
FROM    OPENROWSET('SQLOLEDB', '127.0.0.1'; 'sa'; 'sa_password',
                   'exec msdb.dbo.sp_help_job')

这样的写法,既免去了手动建表的麻烦,也可以避免insert exec 无法嵌套的问题。几乎所有SQL语句都可以使用。

--dbcc不能直接运行
SELECT  a.*
INTO    #t
FROM    OPENROWSET('SQLOLEDB', '127.0.0.1'; 'sa'; 'sa_password',
                   'dbcc log(''master'',3)') AS a

--可以变通一下
SELECT  a.*
INTO    #t
FROM    OPENROWSET('SQLOLEDB', '127.0.0.1'; 'sa'; 'sa_password',
                   'exec(''DBCC LOG(''''master'''',3)'')') AS a

SELECT INTO

该语句不需要我们事先建立目标表,而是直接拷贝数据源或者查询结果数据定义:比如列名,类型,是否为空,自增等来建立目标表。

-- simple SELECT INTO
IF OBJECT_ID(N'Sales.MyOrders', N'U') IS NOT NULL DROP TABLE Sales.MyOrders;

SELECT orderid, custid, orderdate, shipcountry, freight
INTO Sales.MyOrders
FROM Sales.Orders
WHERE shipcountry = N'Norway';

通过以下存储可以查看查询返回字段的结构,注意name,system_type_name,is_nullable.

EXEC sp_describe_first_result_set N'SELECT * FROM Sales.Customers;';

利用select into 生成一个空表

select * into #temp from sysobjects where 1=2

 

实际插入案例

1) 学生表插入

CREATE PROCEDURE [dbo].[Students_Insert]
    (
      @ID INT ,
      @LASTNAME VARCHAR(50) ,
      @FIRSTNAME VARCHAR(50) ,
      @STATE VARCHAR(50) ,
      @PHONE VARCHAR(50) ,
      @EMAIL VARCHAR(50) ,
      @GRADYEAR INT ,
      @GPA DECIMAL(20, 10) ,
      @PROGRAM VARCHAR(50) ,
      @NEWSLETTER BIT
    )
AS
    BEGIN
    --Check to make sure the ID does not already exist
    --If it does, return error
        DECLARE @existing AS INT = 0
        SELECT  @existing = COUNT(ID)
        FROM    Students
        WHERE   ID = @ID
    
        IF @existing > 0
            BEGIN
                RAISERROR ('ID already exists', 1, 1)
                RETURN 0
            END
    --Format GPA as 2 decimal places
        DECLARE @TwoDecimalGPA AS DECIMAL(3, 2)
        SELECT  @TwoDecimalGPA = CAST(@GPA AS NUMERIC(3, 2))
    --Make sure GPA is within range
        IF ( ( @TwoDecimalGPA > 4 )
             OR ( @TwoDecimalGPA < 0 )
           )
            BEGIN
                RAISERROR ('GPA value is invalid', 1, 1)
                RETURN 0
            END     
    --Attempt insert
        INSERT  INTO [dbo].[Students]
                ( [ID] ,
                  [LASTNAME] ,
                  [FIRSTNAME] ,
                  [STATE] ,
                  [PHONE] ,
                  [EMAIL] ,
                  [GRADYEAR] ,
                  [GPA] ,
                  [PROGRAM] ,
                  [NEWSLETTER]
                )
        VALUES  ( @ID ,
                  @LASTNAME ,
                  @FIRSTNAME ,
                  @STATE ,
                  @PHONE ,
                  @EMAIL ,
                  @GRADYEAR ,
                  @TwoDecimalGPA ,
                  @PROGRAM ,
                  @NEWSLETTER
                )
           --check to see if insert occured 
           --and return status
        IF @@ROWCOUNT = 1
            RETURN 1
        ELSE
            RETURN 0
    END
GO

2) 循环插入

-----SQL SERVER中直接循环写入数据-----
DECLARE @i INT
SET @i = 1
WHILE @i < 30
    BEGIN
        INSERT  INTO test
                ( userid )
        VALUES  ( @i )
        SET @i = @i + 1
    END
--案例:
--有如下表,要求就裱中所有沒有及格的成績,在每次增長0.1的基礎上,使他們剛好及格:
--    Name     score
--    Zhangshan   80
--    Lishi       59
--    Wangwu      50
--    Songquan    69

WHILE ( ( SELECT    MIN(score)
          FROM      tb_table
        ) < 60 )
    BEGIN
        UPDATE  tb_table
        SET     score = score * 1.01
        WHERE   score < 60
        IF ( SELECT MIN(score)
             FROM   tb_table
           ) > 60
            BREAK
        ELSE
            CONTINUE
    END

参考文档

The Data Loading Performance Guide http://msdn.microsoft.com/en-us/library/dd425070.aspx.

01. 把存储过程结果集SELECT INTO到临时表 http://www.cnblogs.com/seusoftware/p/3222564.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/167131.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • VMware中卸载Ubuntu「建议收藏」

    VMware中卸载Ubuntu「建议收藏」1、右键>>管理>>从磁盘中删除2、点击“是”,磁盘路径安装Ubuntu的文件一并删除

    2022年8月30日
    13
  • c 语言加壳项目,C 加壳工具,快速完成加密保护

    c 语言加壳项目,C 加壳工具,快速完成加密保护当前C#.net语言的应用范围越来越广泛,IIS的服务器架构后台代码、桌面应用程序的winform、Unity3d的逻辑脚本都在使用。C#.net具备强大的便捷特性,使得开发成本极低。而作为一款.net语言,也有它让开发者头疼的弊病——非常容易被反编译。市面上的Dnspy,ILspy,de4dot等工具可以非常容易反编译出被混淆保护的C#.net程序。01解决方案深思自主研…

    2022年6月27日
    34
  • 中国地图china.js[通俗易懂]

    中国地图china.js[通俗易懂]中国地图china.js一、简介中国地图china是基于echarts.js和china.js绘制图像。官方已不支持china.js下载china.js:https://static.delebug.com/echarts/china.js二、配置项//china.js的配置项与echarts基本图形配置项相通//关于echarts基本图形配置参考:https://echarts.apache.org/v4/zh/option.html//其中china地图主要配置不同处在seri

    2022年7月20日
    17
  • SQL Server 2008R2安装图解教程(附下载链接)「建议收藏」

    SQL Server 2008R2安装图解教程(附下载链接)「建议收藏」下载链接及密码:https://pan.baidu.com/s/1AUrOTnZ_uN0-q7syV2vpGg密码:0u08注:安装SQLServer2008之前,必须预先安装NETFramework3.51、双击下载好的安装文件setup.exe。(在Windows7操作系统系,启动MicrosoftSQL2008安装程序后,系统兼容性助手将提示软件存在兼容性…

    2022年6月23日
    29
  • 图解YU12、I420、YV12、NV12、NV21、YUV420P、YUV420SP、YUV422P、YUV444P的区别

    图解YU12、I420、YV12、NV12、NV21、YUV420P、YUV420SP、YUV422P、YUV444P的区别android平台下基于Camera详解NV21(YUV420P)、NV12(YUV420SP)和RGBA、RGB、BGRA、BGR概述NV21参考:https://blog.csdn.net/leixiaohua1020/article/details/50534150https://blog.csdn.net/junzia/article/details/76315120https…

    2022年7月16日
    19
  • 西门子plc冒泡法排序程序_博途graph编程讲解

    西门子plc冒泡法排序程序_博途graph编程讲解TIA博途中实现冒泡排序的两种SCL语言算法TIA博途软件版本:V15.0首先新建一个项目(具体过程这里就不演示了),添加一个FC块(或FB块均可),编程语言选择SCL,如下图,在FC的块接口中,定义我们需要的变量;一个数组型INT变量a用于存储需要排序的数据;一个INT型变量i:排序的起始序号;一个INT型变量j:排序的结束序号;一个TEMP型变量temp1:用于暂时存储中间比较的数据;利用SCL语言中的FOR循环语句,如下图中的程序,使得数组中的数据从a[i]开始比较到a[j],然后从小

    2022年10月6日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号