笔记-Microsoft SQL Server 2008技术内幕:T-SQL语言基础-08 数据修改

插入数据

T-SQL提供了几种数据插入的语句:INSERT VALUES、INSERT SELECT、INSERT EXEC、SELECT INTO及BULK INSERT。

INSERT VALUES语句:

INSERT INTO dbo.Orders(orderid, orderdate, empid, custid)
  VALUES(10001, ‘20090212‘, 3, ‘A‘);

SQL Server 2008增强了VALUES语句的功能,允许在一条语句中指定由逗号分隔开的多行记录:

INSERT INTO dbo.Orders
  (orderid, orderdate, empid, custid)
VALUES
  (10003, ‘20090213‘, 4, ‘B‘),
  (10004, ‘20090214‘, 1, ‘A‘),
  (10005, ‘20090213‘, 1, ‘C‘),
  (10006, ‘20090215‘, 3, ‘C‘);

在SQL Server 2008中还可以用VALUES来构建虚拟表:

SELECT *
FROM ( VALUES
         (10003, ‘20090213‘, 4, ‘B‘),
         (10004, ‘20090214‘, 1, ‘A‘),
         (10005, ‘20090213‘, 1, ‘C‘),
         (10006, ‘20090215‘, 3, ‘C‘) )
     AS O(orderid, orderdate, empid, custid);

INSERT SELECT语句,注意,目标表必须事先存在。

INSERT INTO dbo.Orders(orderid, orderdate, empid, custid)
  SELECT orderid, orderdate, empid, custid
  FROM TSQLFundamentals2008.Sales.Orders
  WHERE shipcountry = ‘UK‘;

INSERT EXEC语句

INSERT INTO dbo.Orders(orderid, orderdate, empid, custid)
  EXEC TSQLFundamentals2008.Sales.usp_getorders @country = ‘France‘;

SELECT INTO语句

SELECT orderid, orderdate, empid, custid
INTO dbo.Orders
FROM TSQLFundamentals2008.Sales.Orders;

SELECT INTO语句会复制来源表的基本结构(包括列名、数据类型、是否允许为NULL及IDENTITY属性)和数据。约束、索引及触发器不会从来源表中复制过来。

BULK INSERT语句

BULK INSERT dbo.Orders FROM ‘c:\temp\orders.txt‘
  WITH
    (
       DATAFILETYPE    = ‘char‘,
       FIELDTERMINATOR = ‘,‘,
       ROWTERMINATOR   = ‘\n‘
    );

带有TOP选项的数据更新

以下代码将删除具有最小订单ID值的50个订单,而不是随机删除50行:

WITH C AS
(
  SELECT TOP(50) *
  FROM dbo.Orders
  ORDER BY orderid
)
DELETE FROM C;

OUTPUT子句

INSERT INTO dbo.T1(datacol)
  OUTPUT inserted.keycol, inserted.datacol
    SELECT lastname
    FROM TSQLFundamentals2008.HR.Employees
    WHERE country = N‘USA‘;

OUTPUT子句为每个修改过的行返回一个输出行。如果有一个需求,出于审核的目的,需要把修改过的行的一个子集导入一个表:

INSERT INTO dbo.ProductsAudit(productid, colname, oldval, newval)
  SELECT productid, N‘unitprice‘, oldval, newval
  FROM (UPDATE dbo.Products
          SET unitprice *= 1.15
        OUTPUT
          inserted.productid,
          deleted.unitprice AS oldval,
          inserted.unitprice AS newval
        WHERE SupplierID = 1) AS D
  WHERE oldval < 20.0 AND newval >= 20.0;
时间: 2024-10-27 13:57:37

笔记-Microsoft SQL Server 2008技术内幕:T-SQL语言基础-08 数据修改的相关文章

笔记-Microsoft SQL Server 2008技术内幕:T-SQL语言基础-10 可编程对象

关于批处理 下列语句不能在同一批处理中和其他语句同时编译:CREATE DEFAULT.CREATE FUNCTION.CREATE PROCEDURE.CREATE RULE.CREATE SCHEMA.CREATE TRIGGER及CREATE VIEW.例如,以下代码包含一个IF语句,之后在同一批处理中跟着一个CREATE VIEW语句,SQL Server将会报错: IF OBJECT_ID('Sales.MyView', 'V') IS NOT NULL DROP VIEW Sales

笔记-Microsoft SQL Server 2008技术内幕:T-SQL语言基础-07 透视、逆透视及分组集

透视转换 透视数据是一种把数据从行的状态旋转为列的状态的处理.每个透视转换将涉及分组.扩展及聚合三个逻辑处理阶段,每个阶段都有相关的元素:分组阶段处理相关的分组或行元素,扩展阶段处理相关的扩展或列元素,聚合阶段处理相关的聚合元素和聚合函数.现在假设有一张表数据如下: 我现在需要查询出下面的结果: 需求分析:需要在结果中为每一个雇员生成一行记录,这就需要对Orders表中的行按照其empid列进行分组:从结果看,还需要为每一个客户生成一个不同的结果列,那么扩展元素就是custid列:最后还需要对数

笔记-Microsoft SQL Server 2008技术内幕:T-SQL语言基础-06 集合运算

T-SQL支持3种集合运算:并集(UNION).交集(INTERSECT)和差集(EXCEPT).集合运算涉及的两个查询不能包含ORDER BY子句. UNION ALL集合运算 UNION ALL不会对行进行比较,也不会删除重复行.假设查询Query1返回m行,查询Query2返回n行,则Query1 UNION ALL Query2返回(m+n)行. SELECT country, region, city FROM HR.Employees UNION ALL SELECT country

笔记-Microsoft SQL Server 2008技术内幕:T-SQL语言基础-05 表表达式

一般来说,表表达式既不会对性能产生正面影响,也不会对性能产生负面影响. 注意下面这种代码风格: SELECT orderyear, COUNT(DISTINCT custid) AS numcusts FROM (SELECT YEAR(orderdate), custid FROM Sales.Orders) AS D(orderyear, custid) GROUP BY orderyear; 公用表表达式 公用表表达式(CTE,Common table expression)是用WITH子

笔记-Microsoft SQL Server 2008技术内幕:T-SQL语言基础-02 单表查询

SELECT子句中的别名 SELECT子句是在FROM.WHERE.GROUP BY,以及HAVING子句后处理的,这意味着对于SELECT子句之前处理的那些子句,在SELECT子句中为表达式分配的别名并不存在.例如: SELECT orderid, YEAR(orderdate) AS orderyear FROM Sales.Orders WHERE orderyear > 2006; 这是错误的,WHERE子句中并不能识别orderyear别名,应该改为: SELECT orderid,

笔记-Microsoft SQL Server 2008技术内幕:T-SQL语言基础-03 联接查询

联接有三种基本类型:交叉联接.内联接和外联接.交叉联接只有一个步骤——笛卡尔积:内联接有两个步骤——笛卡尔积.过滤:外联接有三个步骤——笛卡尔积.过滤.添加外部行. 内联接 代码: SELECT E.empid, E.firstname, E.lastname, O.orderid FROM HR.Employees AS E JOIN Sales.Orders AS O ON E.empid = O.empid; 另一种写法: SELECT E.empid, E.firstname, E.la

笔记-Microsoft SQL Server 2008技术内幕:T-SQL语言基础-09 事务和并发

事务必须有四个属性:原子性.一致性.隔离性.持久性,这四个属性的首字母可以缩写为ACID. 以下代码定义了一个事务,插入新订单数据: -- Start a new transaction BEGIN TRAN; -- Declare a variable DECLARE @neworderid AS INT; -- Insert a new order into the Sales.Orders table INSERT INTO Sales.Orders (custid, empid, ord

学习Microsoft SQL Server 2008技术内幕:T-SQL语法基础--第4章

第4章 子查询 4.2.1 Exist 谓语: use TSQLFundamentals2008 select * from Sales.Customers as C where c.country=N'Spain' select * from Sales.Customers as C where c.country=N'Spain' and exists(select * from Sales.Orders as O where o.custid=C.custid) select * from

学习Microsoft SQL Server 2008技术内幕:T-SQL语法基础

第 2 章: 单表查询 use TSQLFundamentals2008; select * from Sales.orders; select empid, year(orderdate) as orderyear, Count(*) as numorders from Sales.Orders where custid='71' group by empid, year(orderdate) having count(*) >1 order by empid, orderyear; sele