INSERT VALUES

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

-- single row
INSERT INTO Sales.MyOrders(custid, empid, orderdate, shipcountry, freight)
VALUES(2, 19, '', 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, '', N'USA', 50.00),
(5, 13, '', N'USA', 40.00),
(7, 17, '', 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

SQL 插入语句汇总的更多相关文章

  1. 快速将一个表的数据生成SQL插入语句

    将一个表中的数据生成SQL插入语句,方便系统快速初始化,在数据库中执行创建以下过程就可以了. ) Drop Procedure GenerateData go CREATE PROCEDURE Gen ...

  2. [lua, mysql] 将多条记录数据组合成一条sql插入语句(for mysql)

    -- 演示将多条记录数据组合成一条sql插入语句(for mysql) function getTpl0(tname) -- 获取表各个字段 local t = { tpl_pack = {" ...

  3. 小程序实现sql插入语句转换成Laravel迁移语句

    sql的插入语句长这样: INSERT INTO `media` (`MediaID`, `type`, `filename`, `title`) VALUES (1, 'word', 'word1. ...

  4. 如何通过注解Bean类来封装SQL插入语句

    整体思路是酱紫的: 给bean上注解说明该bean对应着数据库中哪张表,给每个bean的属性都注解说明各自对应着这张表的哪个字段. 通过类反射获取表名,通过逐个反射每个属性的getter方法,获取注解 ...

  5. 比较两个文件不同以及生成SQL插入语句

    Tips 做一个终身学习的人! 日拱一卒,功不唐捐. 今天有个小小的需求,具体需求是这样的: 有两个文本文件,每个文件都有一些字符串文本: 比较第一个文件中,在第二个文件中,不存在的字符串文本: 把这 ...

  6. sql常用语句汇总

    --创建数据库 USE yuju CREATE database YuJu on primary ( name='YuJu', filename='B:\ceshi数据库\YuJu.mdf', max ...

  7. SQL基本语句汇总

    语句:CREATE TABLE 作用:创建表格 格式:CREATE TABLE tableName (columnName1 columnDataType1, columnName2 columnDa ...

  8. sql插入语句笔记

    使用INSERT插入数据行 [一次插入一行数据] 全写: INSERT  INTO  renshi  (name, sex, age ,tel) VALUES  ('胡大姐','女','35','13 ...

  9. 最新省市区数据,sql插入语句

    --省数据 insert into Province (ProvinceName)  values('北京市'); insert into Province (ProvinceName)  value ...

随机推荐

  1. Web颜色搭配 - 收集

    颜色1  颜色一   背景 字 RGB 43,41,46 92,187,207 HEX #2B292E #5CBBCF HSB 264,11,18 190,56,81 CMYK 7,11,0,82 5 ...

  2. 星际地图制作中OB无建筑 退出问题

    星际地图制作中OB玩家没有建筑强制退出问题,目前 用下面的方法解决 ob玩家分到一个组,触发里面 延时几秒 我设置的2秒 KILL掉这个组的建筑就行~

  3. mysql 特殊语句

    1.获取下当前mysql的插件目录select @@plugin_dir 2.mysql移动文件 select load_file('文件路径') into dumpfile '导出路径' 3.des ...

  4. 测试scanf输入含非法控制符

    心得: 学到scanf命令时第一个想到的就是可以利用scanf做一个十进制转16进制.八进制的小程序,很天真的以为也可以转二进制,在搜索字符控制符的时候才知道原来没有二进制的控制字符,需要换算出来得出 ...

  5. SSD的基本架构

    在SSD的优势一章中,我们对比过HDD和SSD的内部区别.现在,我们再谈一下SSD的基本架构.                   上图为一款典型的SSD架构图解,各部分的解释如下:       操作 ...

  6. 原生javascript实现ajax,post参数

    var json = { userid: userid, cid: cid, openid: openid, type: 1 }; // 原生ajax json = (function(obj){ / ...

  7. HDU 4464 Browsing History(最大ASCII的和)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4464 Problem Description One day when you are going t ...

  8. Oracle闪回操作

    Oracle闪回操作 1. 记录当前时间或SCN 在数据库变动前记录时间或SCN SQL> select  to_char(sysdate,'YYYY-MM-DD HH24:mi:ss') fr ...

  9. iOS中Block介绍 基础

    ios开发block的使用指南,以及深入理解block的内存管理,也适用于osx开发.讨论范围:block的使用,内存管理,内部实现.不包含的内容:gc arc下的block内存,block在c++中 ...

  10. wpf 如何设置滚动条在超出范围的时候才显示?(转)

    VerticalScrollBarVisibility="Auto"  垂直自动显示 HorizontalScrollBarVisibility="Auto" ...