SQL SERVER 2005 T_SQL新的特性以及解决并发

None.gif一.修改语句的增强
None.gifUPDATE test SET tname.WRITE('one hundred and two', 9, 3) WHERE tid = 102
None.gif
None.gif在2005中增强了update方法,这是修改test表的列tname WRITE方法是把tname这个列中从字符串9开始 把3个长的字符串改为one hundred and two
None.gif
None.gif二、异常的捕获
None.gif可以捕获过去会导致批处理终止和事务的错误,但是不能处理连接中断错误和硬件错误等
None.gif--Using the try..catch.. construct and invoking a run-time error
None.gifSET XACT_ABORT of   这个打开捕获异常的开关 ,默认是关闭的
None.gifBEGIN TRY
None.gif   BEGIN TRAN
None.gif        INSERT INTO score VALUES (102,78) 
ExpandedBlockStart.gifContractedBlock.gif    INSERT INTO score VALUES (107, 76) /**//* Foreign Key Error */ 
None.gif    INSERT INTO score VALUES (103,81) 
None.gif   COMMIT TRAN
None.gif    PRINT 'Transaction committed'
None.gifEND TRY
None.gifBEGIN CATCH
None.gif    ROLLBACK
None.gif    PRINT 'Transaction rolled back'
None.gif        SELECT ERROR_NUMBER() AS ErrorNumber,
None.gif        ERROR_SEVERITY() AS ErrorSeverity,
None.gif        ERROR_STATE() as ErrorState,
None.gif        ERROR_MESSAGE() as ErrorMessage;
None.gifEND CATCH
None.gifGO
None.gif三、快照隔离
None.gif写入程序不会影响读取程序,可对事务冲突的检测
None.gifcreate database demo2  建立数据库
None.gifgo
None.gifuse demo2
None.gifalter database demo2 set allow_snapshot_isolation on  打开快照隔离开关,默认是关闭的
None.gifcreate table test
None.gif( tid int not null primary key,
None.gif  tname varchar(50) not null
None.gif)
None.gifinsert into test values(1,'version1')
None.gifinsert into test values(2,'version2')
None.gif
None.gif--connection 1
None.gif
None.gifuse demo2
None.gifbegin tran
None.gif update test set tname='version3' where tid=2
None.gif select * from test
None.gif
None.gif--connection 2
None.gifuse demo2
None.gifset transaction isolation level snapshot
None.gifselect * from test
None.gif
None.gif--it will ok, you can see it 
None.gif四 、top语句的增强
None.gif可以是数字表达式,一返回要通过通过查询影响的行输或者百分比还可以是更具情况使用变量和子查询
None.gif可以在delete、update和insert中使用top选项,更好的代替set rowcount选项,使之更为有效。
None.gif--create a table and insert some data
None.gifuse demo
None.gifgo
None.gifCREATE TABLE toptest (column1 VARCHAR(150))
None.gifgo
None.gifINSERT INTO toptest VALUES('t1')
None.gifINSERT INTO toptest VALUES('t2')
None.gifINSERT INTO toptest VALUES('t3')
None.gifINSERT INTO toptest VALUES('t4')
None.gifINSERT INTO toptest VALUES('t5')
None.gifINSERT INTO toptest VALUES('t6')
None.gifINSERT INTO toptest VALUES('t7')
None.gifINSERT INTO toptest VALUES('t8')
None.gifselect * from toptest
None.gifgo
None.gif
None.gifCREATE TABLE toptest2 (column2 VARCHAR(150))
None.gifgo
None.gifINSERT INTO toptest2 VALUES('c1')
None.gifINSERT INTO toptest2 VALUES('c2')
None.gif
None.gif--declare 3 variables
None.gifDECLARE @a INT
None.gifDECLARE @b INT
None.gifDECLARE @c INT
None.gif--set values
None.gifSET @a = 10
None.gifSET @b = 5
None.gifSELECT @c = @a/@b
None.gif--use the calculated expression
None.gifSELECT TOP(@c) * FROM toptest
None.gif--use a SELECT statement as expression
None.gifSELECT TOP(SELECT COUNT(*) FROM toptest2) * 
None.gifFROM toptest
None.gif
None.gif--DML top
None.gifDELETE TOP(2) toptest where column1>'t6'
None.gif--this sets 't1' and 't2' to 'hi'
None.gifUPDATE TOP(2) toptest SET column1 = 'hi' where column1<='t2'
None.gif
None.gifSELECT * FROM toptest
None.gif五、output
None.gif引入一个新的output字句 可以使您从修改语句(elete、update和insert)中将数据返回到表变量中
None.gif语法:output <dml_select_list> into @table_variable
None.gif可以通过应用插入的表和删除的表来访问被修改的行的旧/新映象,起方式于访问触发器类似,在insert语句中,只能访问插入的表,update和delete也一样。访问临时表
None.gif--create table and insert data
None.gifuse demo
None.gifgo
None.gifCREATE TABLE tt 
None.gif(id INT IDENTITY, c1 VARCHAR(15))
None.gifgo
None.gifINSERT INTO tt VALUES ('r1')
None.gifINSERT INTO tt VALUES ('r2')
None.gifINSERT INTO tt VALUES ('r5')
None.gifINSERT INTO tt VALUES ('r6')
None.gifINSERT INTO tt VALUES ('r7')
None.gifINSERT INTO tt VALUES ('r8')
None.gifINSERT INTO tt VALUES ('r9')
None.gifINSERT INTO tt VALUES ('r10')
None.gif
None.gif--make a table variable to hold the results of the OUTPUT clause
None.gifDECLARE @del AS TABLE (deletedId INT, deletedValue VARCHAR(15))
None.gifDELETE tt
None.gifOUTPUT DELETED.id, DELETED.c1 INTO @del
None.gifWHERE id < 3
None.gifSELECT * FROM @del
None.gifGO
None.gif
None.gif六、函数
None.gifROW_NUMBER是结果集的顺序, 而不是数据库中纪录存放的原始顺序
None.gifSELECT orderid,qty,
None.gif  ROW_NUMBER() OVER(ORDER BY qty) AS rownumber,
None.gif  RANK()       OVER(ORDER BY qty) AS rank,
None.gif  DENSE_RANK() OVER(ORDER BY qty) AS denserank 
None.gifFROM rankorder
None.gifORDER BY qty
None.gif七、通用表达式 cte 临时命名的结果集
None.gifUSE AdventureWorks
None.gifGO
None.gifWITH SalesCTE(ProductID, SalesOrderID)
None.gifAS 
None.gif(
None.gif    SELECT ProductID, COUNT(SalesOrderID) 
None.gif    FROM Sales.SalesOrderDetail 
None.gif    GROUP BY ProductID
None.gif)
None.gifSELECT * FROM SalesCTE
None.gif----
None.gif
None.gif
None.gif-- Using CTEs Recursively
None.gifuse demo
None.gifgo
None.gifCREATE TABLE CarParts
None.gif(
None.gif    CarID int NOT NULL,
None.gif    Part varchar(15),
None.gif    SubPart varchar(15),
None.gif    Qty int
None.gif)
None.gifGO
None.gifINSERT CarParts 
None.gifVALUES (1, 'Body', 'Door', 4)
None.gifINSERT CarParts 
None.gifVALUES (1, 'Body', 'Trunk Lid', 1)
None.gifINSERT CarParts 
None.gifVALUES (1, 'Body', 'Car Hood', 1)
None.gifINSERT CarParts 
None.gifVALUES (1, 'Door', 'Handle', 1)
None.gifINSERT CarParts 
None.gifVALUES (1, 'Door', 'Lock', 1)
None.gifINSERT CarParts 
None.gifVALUES (1, 'Door', 'Window', 1)
None.gifINSERT CarParts 
None.gifVALUES (1, 'Body', 'Rivets', 1000)
None.gifINSERT CarParts 
None.gifVALUES (1, 'Door', 'Rivets', 100)
None.gifINSERT CarParts 
None.gifVALUES (1, 'Door', 'Mirror', 1)
None.gifgo
None.gifselect * from CarParts
None.gifgo
None.gif
None.gifWITH CarPartsCTE(SubPart, Qty) 
None.gifAS
None.gif(
None.gif    -- Anchor Member (AM):
None.gif    -- SELECT query that doesn’t refer back to CarPartsCTE
None.gif    SELECT SubPart, Qty
None.gif    FROM CarParts
None.gif    WHERE Part = 'Body'
None.gif    UNION ALL
None.gif    -- Recursive Member (RM):
None.gif    -- SELECT query that refers back to CarPartsCTE
None.gif    SELECT CarParts.SubPart, CarPartsCTE.Qty * CarParts.Qty
None.gif    FROM CarPartsCTE 
None.gif    INNER JOIN CarParts ON CarPartsCTE.SubPart = CarParts.Part
None.gif    WHERE CarParts.CarID = 1
None.gif)
None.gif--outer query
None.gifSELECT SubPart, SUM(Qty) AS TotalNUM
None.gifFROM CarPartsCTE
None.gifGROUP BY SubPart
None.gif八、新的关系运算符
None.gifpivot   把行转回为列
None.gifunpivot 把列转回为行
None.gifuse demo
None.gifgo
None.gif
None.gifcreate table orders
None.gif(Customer varchar(10) not null,
None.gif product varchar(20) not null,
None.gif quantity int not null)
None.gifgo
None.gifinsert orders values('Mike', 'Bike',3)
None.gifinsert orders values('Mike','Chain',2)
None.gifinsert orders values('Mike','Bike',5)
None.gifinsert orders values('Lisa','Bike',3)
None.gifinsert orders values('Lisa','Chain',3)
None.gifinsert orders values('Lisa','Chain',4)
None.gifinsert orders values('Lisa','Bike',2)
None.gif
None.gifselect * from orders
None.gif
None.gifselect * from orders
None.gifpivot (sum(quantity) for product in ([Bike],[Chain])) as a
None.gifuse demo
None.gifgo
None.gifCREATE TABLE SALES1
None.gif(
None.gif[Year] INT,
None.gifQuarter CHAR(2),
None.gifAmount FLOAT
None.gif)
None.gifGO
None.gifINSERT INTO SALES1 VALUES (2001, 'Q1', 80)
None.gifINSERT INTO SALES1 VALUES (2001, 'Q2', 70)
None.gifINSERT INTO SALES1 VALUES (2001, 'Q3', 55)
None.gifINSERT INTO SALES1 VALUES (2001, 'Q3', 110)
None.gifINSERT INTO SALES1 VALUES (2001, 'Q4', 90)
None.gifINSERT INTO SALES1 VALUES (2002, 'Q1', 200)
None.gifINSERT INTO SALES1 VALUES (2002, 'Q2', 150)
None.gifINSERT INTO SALES1 VALUES (2002, 'Q2', 40)
None.gifINSERT INTO SALES1 VALUES (2002, 'Q2', 60)
None.gifINSERT INTO SALES1 VALUES (2002, 'Q3', 120)
None.gifINSERT INTO SALES1 VALUES (2002, 'Q3', 110)
None.gifINSERT INTO SALES1 VALUES (2002, 'Q4', 180)
None.gifGO
None.gif
None.gifSELECT * FROM SALES1
None.gifPIVOT
None.gif(SUM (Amount) --Aggregate the Amount column using SUM
None.gifFOR [Quarter] --Pivot the Quarter column into column headings
None.gifIN (Q1, Q2, Q3, Q4)) --use these quarters
None.gifAS P
None.gifGO
None.gif
None.gifselect * into temp1 from orders
None.gifpivot (sum(quantity) for product in ([Bike],[Chain])) as a
None.gif
None.gifselect * from temp1
None.gif
None.gifselect customer, product,quantity
None.giffroam temp1
None.gifunpivot(quantity for product in ([Bike],[Chain])) as a
None.gif九、ddl触发器
None.gifuse demo
None.gifgo
None.gifCREATE TRIGGER prevent_drop_table ON DATABASE FOR DROP_TABLE
None.gifAS
None.gifRAISERROR('Not allowed to drop tables.', 10, 1)
None.gifPRINT 'DROP TABLE attempt in database ' + DB_NAME() + '.'
None.gifPRINT CONVERT (nvarchar (1000),EventData())
None.gifROLLBACK
None.gifGO
None.gif-- test
None.gifCREATE TABLE TestDROP(col1 INT)
None.gifgo
None.gifINSERT INTO TestDROP VALUES(1)
None.gif
None.gifdrop talbe testdrop
None.gif
None.gif-- Server
None.gifCREATE TRIGGER audit_ddl_logins ON ALL SERVER
None.gif  FOR CREATE_LOGIN, ALTER_LOGIN, DROP_LOGIN
None.gifAS
None.gifPRINT 'DDL LOGIN took place.'
None.gifPRINT CONVERT (nvarchar (1000),EventData())
None.gifGO
None.gif
None.gif-- test
None.gifCREATE LOGIN login1 WITH PASSWORD = '123'
None.gifALTER LOGIN login1 WITH PASSWORD = 'xyz'
None.gifDROP LOGIN login1
None.gif丰富的数据类型 Richer Data Types 
None.gif
None.gif1、varchar(max)、nvarchar(max)和varbinary(max)数据类型最多可以保存2GB的数据,可以取代text、ntext或image数据类型。
None.gifCREATE TABLE myTable
None.gif(
None.gif    id INT,
None.gif    content VARCHAR(MAX)
None.gif)
None.gif
None.gif2、XML数据类型
None.gifXML数据类型允许用户在SQL Server数据库中保存XML片段或文档。
None.gif
None.gif错误处理 Error Handling 
None.gif
None.gif1、新的异常处理结构
None.gif
None.gif2、可以捕获和处理过去会导致批处理终止的错误
None.gif前提是这些错误不会导致连接中断(通常是严重程度为21以上的错误,例如,表或数据库完整性可疑、硬件错误等等。)。
None.gif
None.gif3、TRY/CATCH 构造
None.gifSET XACT_ABORT ON
None.gif   BEGIN TRY
None.gif     <core logic>
None.gif   END TRY
None.gif   BEGIN CATCH TRAN_ABORT
None.gif     <exception handling logic>
None.gif   END TRY
None.gif
None.gif@@error may be quired as first statement in CATCH block
None.gif
None.gif4、演示代码
None.gifUSE demo
None.gif  GO
None.gif  --创建工作表
None.gif
None.gif  CREATE TABLE student
None.gif  ( 
None.gif      stuid INT NOT NULL PRIMARY KEY,
None.gif      stuname VARCHAR(50)
None.gif  )
None.gif
None.gif  CREATE TABLE score 
None.gif  (
None.gif      stuid INT NOT NULL REFERENCES student(stuid),
None.gif      score INT
None.gif  )
None.gifGO
None.gif
None.gifINSERT INTO student VALUES (101,'zhangsan') 
None.gifINSERT INTO student VALUES (102,'wangwu') 
None.gifINSERT INTO student VALUES (103,'lishi') 
None.gifINSERT INTO student VALUES (104,'maliu') 
None.gif
None.gif--调用一个运行时错误
None.gifSET XACT_ABORT OFF
None.gif  BEGIN TRAN
None.gif     INSERT INTO score VALUES (101,90)
None.gif     INSERT INTO score VALUES (102,78) 
ExpandedBlockStart.gifContractedBlock.gif     INSERT INTO score VALUES (107, 76) /**//* 外键错误 */ 
None.gif     INSERT INTO score VALUES (103,81) 
None.gif     INSERT INTO score VALUES (104,65) 
None.gif  COMMIT TRAN
None.gif  GO
None.gif
None.gif  SELECT * FROM student
None.gif  SELECT * FROM score
None.gif
None.gif--使用TRYdot.gifCATCH构造,并调用一个运行时错误
None.gifSET XACT_ABORT OFF
None.gif  BEGIN TRY
None.gif    BEGIN TRAN
None.gif       INSERT INTO score VALUES (101,90)
None.gif       INSERT INTO score VALUES (102,78) 
ExpandedBlockStart.gifContractedBlock.gif       INSERT INTO score VALUES (107, 76) /**//* 外键错误 */ 
None.gif       INSERT INTO score VALUES (103,81) 
None.gif       INSERT INTO score VALUES (104,65) 
None.gif    COMMIT TRAN
None.gif    PRINT '事务提交'
None.gif  END TRY
None.gif  BEGIN CATCH
None.gif    ROLLBACK
None.gif     PRINT '事务回滚'
None.gif        SELECT ERROR_NUMBER() AS ErrorNumber,
None.gif        ERROR_SEVERITY() AS ErrorSeverity,
None.gif        ERROR_STATE() as ErrorState,
None.gif        ERROR_MESSAGE() as ErrorMessage;
None.gif   END CATCH
None.gifGO
None.gif
None.gifSELECT * FROM score
None.gifGO
None.gif
None.gif快照隔离 Snapshot Isolation
None.gif
None.gif1、写入程序不会阻碍读取程序
None.gif2、Snapshot isolation must be enabled for DB
None.gif      ALTER DATABASE 数据库 SET allow_snapshot_isolation ON
None.gif3、Snapshot isolation must be enabled for connection
None.gif      Set transaction isolation level snapshot
None.gif4、UPDATE transactions keep old versions of data in a linked list
None.gif5、新的隔离级别提供了以下优点:
None.gif  1) 提高了只读应用程序的数据可用性
None.gif  2) 允许在OLTP环境中执行非阻止读取操作
None.gif  3) 可对写入事务进行自动的强制冲突检测
None.gif6、演示代码
None.gifCREATE DATABASE demo2
None.gifGO
None.gifUSE demo2
None.gif   ALTER DATABASE demo2 SET allow_snapshot_isolation ON
None.gif   CREATE TABLE test
None.gif   ( 
None.gif     tid INT NOT NULL primary key,
None.gif     tname VARCHAR(50) NOT NULL
None.gif   )
None.gif  INSERT INTO test VALUES(1,'version1')
None.gif  INSERT INTO test VALUES(2,'version2')
None.gif
None.gif--连接一
None.gif
None.gifUSE demo2
None.gifBEGIN TRAN
None.gif   UPDATE test SET tname='version3' WHERE tid=2
None.gif   SELECT * FROM test
None.gif
None.gif--连接二
None.gifUSE demo2
None.gif   SET transaction isolation level snapshot
None.gif   SELECT * FROM test 
None.gif
None.gifTOP 增强功能
None.gif
None.gif1、TOP 增强
None.gif可以指定一个数字表达式,以返回要通过查询影响的行数或百分比,还可以根据情况使用变量或子查询。
None.gif可以在DELETE、UPDATE和INSERT查询中使用TOP选项。
None.gif
None.gif2、更好地替换SET ROWCOUNT选项,使之更为有效。
None.gif
None.gifOUTPUT
None.gif
None.gif1、SQL Server 2005引入一个新的OUTPUT子句,以使您可以冲修改语句(INSERT、UPDATE、DELETE)中将数据返回到表变量中。
None.gif
None.gif2、新的OUTPUT子局的语法为:
None.gifOUTPUT <dml_select_list> INTO @table_variable
None.gif可以通过引用插入的表或删除的表来访问被修改的行的旧/新影象,其方式与访问触发器类似。在INSERT语句中,只能访问插入的表。在DELETE语句中,只能访问删除的表。在UPDATE语句中,可以访问插入的表和删除的表。
None.gif
None.gif3、代码演示
None.gifUSE demo
None.gifGO
None.gifCREATE TABLE tt 
None.gif(
None.gif  id INT IDENTITY, 
None.gif  c1 VARCHAR(15)
None.gif)
None.gifGO
None.gif
None.gifINSERT INTO tt VALUES ('r1')
None.gifINSERT INTO tt VALUES ('r2')
None.gifINSERT INTO tt VALUES ('r5')
None.gifINSERT INTO tt VALUES ('r6')
None.gifINSERT INTO tt VALUES ('r7')
None.gifINSERT INTO tt VALUES ('r8')
None.gifINSERT INTO tt VALUES ('r9')
None.gifINSERT INTO tt VALUES ('r10')
None.gif
None.gifDECLARE @del AS TABLE (deletedId INT, deletedValue VARCHAR(15))
None.gifDELETE tt
None.gifOUTPUT DELETED.id, DELETED.c1 INTO @del
None.gifWHERE id < 3
None.gifSELECT * FROM @del
None.gifGO
None.gif-----------------------------------------------
None.gifUSE demo
None.gifGO
None.gifCREATE TABLE toptest (column1 VARCHAR(150))
None.gifGO
None.gifINSERT INTO toptest VALUES('t1')
None.gifINSERT INTO toptest VALUES('t2')
None.gifINSERT INTO toptest VALUES('t3')
None.gifINSERT INTO toptest VALUES('t4')
None.gifINSERT INTO toptest VALUES('t5')
None.gifINSERT INTO toptest VALUES('t6')
None.gifINSERT INTO toptest VALUES('t7')
None.gifINSERT INTO toptest VALUES('t8')
None.gifSELECT * FROM toptest
None.gifGO
None.gif
None.gifCREATE TABLE toptest2 (column2 VARCHAR(150))
None.gifGO
None.gifINSERT INTO toptest2 VALUES('c1')
None.gifINSERT INTO toptest2 VALUES('c2')
None.gif
None.gif--声明3个变量
None.gifDECLARE @a INT
None.gifDECLARE @b INT
None.gifDECLARE @c INT
None.gif
None.gif--赋值
None.gifSET @a = 10
None.gifSET @b = 5
None.gifSELECT @c = @a/@b
None.gif
None.gif--使用计算表达式
None.gifSELECT TOP(@c) * FROM toptest
None.gif
None.gif--使用SELECT语句作为条件
None.gifSELECT TOP(SELECT COUNT(*) FROM toptest2) * 
None.gifFROM toptest
None.gif
None.gif--指出top
None.gifDELETE TOP(2) toptest where column1>'t6'
None.gif
None.gif--更新top
None.gifUPDATE TOP(2) toptest SET column1 = 'hi' where column1<='t2'
None.gif
None.gifSELECT * FROM toptest
None.gif
None.gif排序函数 Ranking Functions
None.gif
None.gif1、SQL Server引入几个新的排序函数:如ROW_NUMBER、RANK、DENSE_RANK等。这些新函数使您可以有效地分析数据以及向查询的结果行提供排序值。
None.gif
None.gif2、排序函数都遵循类似的语法模式:
None.gif()OVER
None.gif([PARTITION BY]
None.gifORDER BY)
None.gif该函数只能在查询的两个子句中指定 - 在SELECT子句或ORDER BY子句中。以下详细讨论不同的函数。  
None.gif
None.gif3、ROW_NUMBER
None.gifROW_NUMBER是结果集的顺序, 而不是数据库中纪录存放的原始顺序
None.gifUSE demo
None.gifGO
None.gifCREATE TABLE rankorder
None.gif(
None.gif orderid INT,
None.gif qty INT
None.gif)
None.gifGO
None.gifINSERT rankorder VALUES(30001,10)
None.gifINSERT rankorder VALUES(10001,10)
None.gifINSERT rankorder VALUES(10006,10)
None.gifINSERT rankorder VALUES(40005,10)
None.gifINSERT rankorder VALUES(30003,15)
None.gifINSERT rankorder VALUES(30004,20)
None.gifINSERT rankorder VALUES(20002,20)
None.gifINSERT rankorder VALUES(20001,20)
None.gifINSERT rankorder VALUES(10005,30)
None.gifINSERT rankorder VALUES(30007,30)
None.gifINSERT rankorder VALUES(40001,40)
None.gifGO
None.gifSELECT orderid,qty,
None.gif  ROW_NUMBER() OVER(ORDER BY qty) AS rownumber,
None.gif  RANK()       OVER(ORDER BY qty) AS rank,
None.gif  DENSE_RANK() OVER(ORDER BY qty) AS denserank 
None.gifFROM rankorder
None.gifORDER BY qty
None.gif
None.gif通用表表达式 Common Table Expressions  
None.gif
None.gif通 用表表达式(CTE)是一个可以由定义语句引用的临时表命名的结果集。在他们的简单形式中,您可以将CTE视为类似于视图和派生表混合功能的改进版本。在 查询的FROM子句中引用CTE的方式类似于引用派生表和视图的方式。只须定义CTE一次,即可在查询中多次引用它。在CTE的定义中,可以引用在同一批 处理中定义的变量。但是CTE的真正威力在于它们的递归功能,即CTE可以包含对它们自身的引用。
None.gif
None.gif视图、派生表和CTE内部的查询的一般形式
None.gif
None.gif1、视图
None.gifCREATE VIEW <view_name>(<column_aliases>) AS <view_query>
None.gif
None.gif2、派生表
None.gifSELECT * FROM (<derived_table)query>) AS <dericed_table_alias>(<column_aliases>)
None.gif
None.gif3、CTE
None.gifWITH <cte_alias>(<column_aliases>)
None.gifAS
None.gif{
None.gif <cte_query>
None.gif)
None.gifSELECT * FROM <cte_alias]>
None.gif在关键字WITH之后,为CTE提供一个别名,并且为它的结果列提供一个可选的别名列表;编写CTE的主体;然后从外部查询中引用它。
None.gif
None.gif4、演示代码
None.gifUSE AdventureWorks
None.gifGO
None.gifWITH SalesCTE(ProductID, SalesOrderID)
None.gifAS 
None.gif(
None.gif SELECT ProductID, COUNT(SalesOrderID) 
None.gif FROM Sales.SalesOrderDetail 
None.gif GROUP BY ProductID
None.gif)
None.gifSELECT * FROM SalesCTE
None.gif
None.gifRecursive CTEs 递归的通用表表达式
None.gif
None.gif递归的CTE是根据至少两个查询(或者称为两个成员)构建的,一个是非递归查询,也成为固定成员,只能调用一次,另外一个是递归查询,也成为递归成员(RM),可以反复调用,直到查询不再返回行。查询由UNION ALL运算符连接为一个单独的CTE。
None.gif
None.gif--使用递归的通用表表达式
None.gifUSE demo
None.gifGO
None.gifCREATE TABLE CarParts
None.gif(
None.gif CarID INT NOT NULL,
None.gif Part VARCHAR(15),
None.gif SubPart VARCHAR(15),
None.gif Qty INT
None.gif)
None.gifGO
None.gifINSERT CarParts VALUES (1, 'Body', 'Door', 4)
None.gifINSERT CarParts VALUES (1, 'Body', 'Trunk Lid', 1)
None.gifINSERT CarParts VALUES (1, 'Body', 'Car Hood', 1)
None.gifINSERT CarParts VALUES (1, 'Door', 'Handle', 1)
None.gifINSERT CarParts VALUES (1, 'Door', 'Lock', 1)
None.gifINSERT CarParts VALUES (1, 'Door', 'Window', 1)
None.gifINSERT CarParts VALUES (1, 'Body', 'Rivets', 1000)
None.gifINSERT CarParts VALUES (1, 'Door', 'Rivets', 100)
None.gifINSERT CarParts VALUES (1, 'Door', 'Mirror', 1)
None.gifGO
None.gifSELECT * FROM CarParts
None.gifGO
None.gif
None.gifWITH CarPartsCTE(SubPart, Qty) 
None.gifAS
None.gif(
None.gif -- 固定成员 (AM):
None.gif -- SELECT查询无需参考CarPartsCTE
None.gif SELECT SubPart, Qty
None.gif FROM CarParts
None.gif WHERE Part = 'Body'
None.gif UNION ALL
None.gif -- 递归成员 (RM):
None.gif -- SELECT查询参考CarPartsCTE
None.gif SELECT CarParts.SubPart, CarPartsCTE.Qty * CarParts.Qty
None.gif FROM CarPartsCTE 
None.gif INNER JOIN CarParts ON CarPartsCTE.SubPart = CarParts.Part
None.gif WHERE CarParts.CarID = 1
None.gif)
None.gif-- 外部查询
None.gifSELECT SubPart, SUM(Qty) AS TotalNUM
None.gifFROM CarPartsCTE
None.gifGROUP BY SubPart   
None.gif
None.gif新的关系运算符 PIVOT/UNPIVOT/APPLY
None.gif
None.gif1、PIVOT
None.gifPIVOT运算符将行旋转为列,并且可能同时执行聚合。使用PIVOT运算符时要注意的重要一点是,需要为它提供一个查询表达式,表达式使用视图、派生表或者是CTE只返回所关注的列。
None.gif
None.gif2、UNPIVOT
None.gifUNPIVOT运算符执行与PIVOT运算符相反的操作;他将列旋转为行了。
None.gif
None.gif3、APPLY
None.gifAPPLY关系运算符允许您对外部表的每个行调用指定的表值函数一次。您可以在查询的FROM子句中指定APPLY,其方式与使用JOIN关系运算符类似。APPLY具有两种形式:CROSS APPLY和OUTER APPLY。
None.gif
None.gif演示:
None.gif
None.gifUSE demo
None.gifGO
None.gif
None.gifCREATE TABLE orders
None.gif(
None.gif Customer VARCHAR(10) NOT NULL,
None.gif product VARCHAR(20) NOT NULL,
None.gif quantity INT NOT NULL
None.gif)
None.gifGO
None.gifINSERT orders VALUES('Mike', 'Bike',3)
None.gifINSERT orders VALUES('Mike','Chain',2)
None.gifINSERT orders VALUES('Mike','Bike',5)
None.gifINSERT orders VALUES('Lisa','Bike',3)
None.gifINSERT orders VALUES('Lisa','Chain',3)
None.gifINSERT orders VALUES('Lisa','Chain',4)
None.gifINSERT orders VALUES('Lisa','Bike',2)
None.gif
None.gifSELECT * FROM orders
None.gif
None.gifSELECT * FROM orders
None.gifPIVOT (SUM(quantity) FOR product IN ([Bike],[Chain])) AS a
None.gifUSE demo
None.gifGO
None.gifCREATE TABLE SALES1
None.gif(
None.gif  [Year] INT,
None.gif  Quarter CHAR(2),
None.gif  Amount FLOAT
None.gif)
None.gifGO
None.gifINSERT INTO SALES1 VALUES (2001, 'Q1', 80)
None.gifINSERT INTO SALES1 VALUES (2001, 'Q2', 70)
None.gifINSERT INTO SALES1 VALUES (2001, 'Q3', 55)
None.gifINSERT INTO SALES1 VALUES (2001, 'Q3', 110)
None.gifINSERT INTO SALES1 VALUES (2001, 'Q4', 90)
None.gifINSERT INTO SALES1 VALUES (2002, 'Q1', 200)
None.gifINSERT INTO SALES1 VALUES (2002, 'Q2', 150)
None.gifINSERT INTO SALES1 VALUES (2002, 'Q2', 40)
None.gifINSERT INTO SALES1 VALUES (2002, 'Q2', 60)
None.gifINSERT INTO SALES1 VALUES (2002, 'Q3', 120)
None.gifINSERT INTO SALES1 VALUES (2002, 'Q3', 110)
None.gifINSERT INTO SALES1 VALUES (2002, 'Q4', 180)
None.gifGO
None.gif
None.gifSELECT * FROM SALES1
None.gifPIVOT
None.gif(SUM (Amount) --使用SUM聚合数量列
None.gifFOR [Quarter] --PIVOT Quarter 列
None.gifIN (Q1, Q2, Q3, Q4)) --使用季节
None.gifAS P
None.gifGO
None.gif
None.gifSELECT * INTO temp1 FROM orders
None.gifPIVOT (sum(quantity) FOR product IN ([Bike],[Chain])) AS a
None.gif
None.gifSELECT * FROM temp1
None.gif
None.gifSELECT customer, product,quantity
None.gifFROM temp1
None.gifUNPIVOT(quantity FOR product IN ([Bike],[Chain])) AS a
None.gif----------------------------------------------------
None.gifUSE demo
None.gifGO
None.gifCREATE TABLE Arrays
None.gif(
None.gif  aid INT NOT NULL IDENTITY PRIMARY KEY,
None.gif  array VARCHAR(7999) NOT NULL
None.gif)
None.gifGO
None.gifINSERT INTO Arrays VALUES('')
None.gifINSERT INTO Arrays VALUES('10')
None.gifINSERT INTO Arrays VALUES('20,40,30')
None.gifINSERT INTO Arrays VALUES('-1,-3,-5')
None.gifGO
None.gifCREATE FUNCTION  function1(@arr AS VARCHAR(7999))
None.gif  RETURNS @t TABLE(pos INT NOT NULL, value INT NOT NULL)
None.gifAS
None.gifBEGIN
None.gif  DECLARE @end AS INT, @start AS INT, @pos AS INT
None.gif  SELECT @arr = @arr + ',', @pos = 1,
None.gif    @start = 1, @end = CHARINDEX(',', @arr, @start)
None.gif  WHILE @end > 1
None.gif  BEGIN
None.gif    INSERT INTO @t VALUES(@pos, SUBSTRING(@arr, @start, @end - @start))
None.gif
None.gif    SELECT @pos = @pos + 1,
None.gif      @start = @end + 1, @end = CHARINDEX(',', @arr, @start)
None.gif  END
None.gif  RETURN
None.gifEND
None.gif
None.gif--测试
None.gifSELECT * FROM function1('200,400,300')
None.gifGO
None.gif
None.gifSELECT A.aid, F.*
None.gifFROM Arrays AS A
None.gif  CROSS APPLY function1(array) AS F
None.gifGO
None.gifSELECT A.aid, F.*
None.gifFROM Arrays AS A
None.gif  OUTER APPLY function1(array) AS F
None.gifGO
None.gif
None.gifDDL触发器 DDL Triggers
None.gif
None.gifSQL Server 2005 可以就整个服务器或数据库的某个范围为DDL事件定义触发器。也可以为单个DDL语句(例如:CREAT_TABLE、DROP_TABLE等)或者为一 组语句(例如:指定DDL_DATABASE_LEVEL_EVENTS想要触发器触发数据库所有DDL事件)定义DDL触发器。
None.gif
None.gif在DDL触发器内部,可以通过访问eventdata()函数获得与激发该触发器的事件有关的数据。该eventdata()函数返回有关事件的xml数据。
None.gif
None.gifDDL触发器特别有用的方案包括DDL更改的完整性检查、审核方案以及其他方案。
None.gif
None.gif代码演示:
None.gif
None.gifUSE demo
None.gifGO
None.gifCREATE TRIGGER prevent_drop_table ON DATABASE FOR DROP_TABLE
None.gifAS
None.gifRAISERROR('没有删除表的权限.', 10, 1)
None.gifPRINT '尝试在数据库' + DB_NAME() + '中删除表.'
None.gifPRINT CONVERT (nvarchar (1000),EventData())
None.gifROLLBACK
None.gifGO
None.gif-- 测试
None.gifCREATE TABLE TestDROP(col1 INT)
None.gifGO
None.gifINSERT INTO TestDROP VALUES(1)
None.gif
None.gifDROP TABLE testdrop
None.gif
None.gif-- Server
None.gifCREATE TRIGGER audit_ddl_logins ON ALL SERVER
None.gif  FOR CREATE_LOGIN, ALTER_LOGIN, DROP_LOGIN
None.gifAS
None.gifPRINT '发生DDL LOGIN.'
None.gifPRINT CONVERT (nvarchar (1000),EventData())
None.gifGO
None.gif
None.gif-- 测试
None.gifCREATE LOGIN login1 WITH PASSWORD = '123'
None.gifALTER LOGIN login1 WITH PASSWORD = 'xyz'
None.gifDROP LOGIN login1
None.gifSQL Server 2005 在Transaction-SQL上所做的改进反映了其更好地满足了ANSI-99 SQL规范的要求以及客户的需求。
None.gif
None.gif
None.gifcreate     proc [dbo].[Name_Add]
None.gif @Name varchar(50)
None.gifas
None.gifbegin
None.gif
None.gifbegin tran
None.gifinsert Names (Name)
None.gifselect (@Name) where not exists (select NameId from Names with(HOLDLOCK) where Name = @Name)
None.gifcommit tran
None.gif
None.gifselect NameId,Name from Names with(nolock) where Name = @Name
None.gifend
None.gif
None.gif 要点:检查,加锁,插入值在一句sql中完成.这样再大的并发也不怕了.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/549869.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android跑分和ios,手机:苹果VS安卓 跑分不代表手机流畅度

原标题&#xff1a;手机&#xff1a;苹果VS安卓 跑分不代表手机流畅度在当前的国内手机市场中&#xff0c;有两个阵营&#xff1a;安卓和苹果。 安卓系统仍然是使用最多的系统。从最初的128M内存到当前的十多GB内存&#xff0c;安卓手机已得到迅速发展和更新。但总体而言&#…

余宏德:Sun所有的核心技术都是开放的

3月30日上午&#xff0c;“Sun 2007年媒体论坛”在香港举办。时值Sun公司成立25周年&#xff0c;因此本次活动备受大家关注。Sun公司大中华区管理层和技术专家与40家左右的媒体记者进行了面对面的讨论。本次活动的主题是“创新共享成长&#xff0d;为社会进步而创新”&#xff…

图示/白话 execve执行流程

转载于:https://www.cnblogs.com/image-eye/archive/2011/07/13/2105411.html

易企秀手机html5场景源码,【VIP源码】六月1日最新完美版易企秀微信场景源码

[v_notice]下面演示图为哥亲测截图&#xff0c;仅供参考&#xff0c;在这里下载的源码100%和演示截图一致[/v_notice]修补的首页&#xff1a;前台用户后台界面&#xff1a;场景制作界面&#xff1a;转场特效页面&#xff1a;特效增加&#xff1a;设计模板&#xff1a;制作预览页…

Effective C# 原则48:了解更多的工具和资源(译)

Effective C# 原则48&#xff1a;了解更多的工具和资源 Item 48: Learn About Tools and Resources 对于C#以及.Net来说这是激动人心的时候。这些工具目前还是比较新的&#xff0c;整个社区都在学习如何使用这些工具。一些资源可以帮助你提高你的知识&#xff0c;以及为.Net和…

计算机2013知识,【2013年计算机基础知识习题与答案(三)】- 环球网校

46.与十进制数128等值的二进制数是10000000.47.与十进制数217等值的二进制数是11011001.48.八进制数的基数为8&#xff0c;能用到的数字符号个数为8.49.十进制数38转换成八进制数是46.50.十进制数72转换成八进制数是110.51.与十进制数283等值的十六进制数是11B.52.与二进制数11…

上周回顾:艾妮闹春 Sun/HP高层人士震荡

进入4月&#xff0c;春暖花开。然而随着Vista首个漏洞“ANI”的到来&#xff0c;上周显然让许多人又紧张了一回。同样紧张的还有IT媒体的记者&#xff1a;周一一上班就传出Sun公司大中华区总裁余宏德和其他高管离职的消息&#xff0c;周五临下班HP中国总裁孙振耀又宣布“退休”…

计算机自带游戏如何删除,详细教你系统怎么删除游戏

很多时候&#xff0c;在我们安装系统就会自带一些游戏软件&#xff0c;但是我们不怎么感兴趣&#xff0c;放在那里有占用内存&#xff0c;只有将它们删除了&#xff0c;如何彻底删除windows系统自带的游戏蜘蛛纸牌呢&#xff1f;下面&#xff0c;就有系统之家小编来给大家讲解系…

win10创建新的计算机用户名和密码错误,Win10开机提示用户名或密码不正确现象的解决办法...

有用户遇到Win10开机提示用户名或密码不正确的问题&#xff0c;当你点击“确定(OK)”后欢迎屏幕上会出现两个相同的用户账户让你选择&#xff0c;让你不知道该选择哪一个&#xff0c;这个问题是什么原因&#xff1f;怎么解决呢。问题原因出现上述问题的原因可能是你在设置了Win…

删除计算机360云盘,win7系统怎么取消电脑右键保存到360云盘选项

在日常使用win7系统的时候&#xff0c;我们经常会用到右键菜单&#xff0c;可是有时候会遇到一些没有用的选项&#xff0c;比如保存到360云盘选项&#xff0c;如果不喜欢的话&#xff0c;要怎么取消电脑右键保存到360云盘选项呢&#xff1f;具体步骤如下。1、首先有这一项的都是…

网吧服务器RAID 0+1硬盘阵列组建图解

网吧服务器RAID 01硬盘阵列组建图解步小羽   2007年04月13日   来源&#xff1a;天下网吧联盟随着网吧规模扩大&#xff0c;网吧电脑数量也会相应增加&#xff0c;上网的顾客也随之增多&#xff0c;服务器硬盘数据存取的速度将会成为新的瓶颈&#xff0c;很多顾客开始投诉服务…

VXLAN实验

拓扑图&#xff1a; SPINE配置&#xff1a; hostname SPINE-1vdc SPINE-1 id 1 limit-resource vlan minimum 16 maximum 4094 limit-resource vrf minimum 2 maximum 4096 limit-resource port-channel minimum 0 maximum 511 limit-resource u4route-mem minimum 248 maximum…

VSTS For Testers读书笔记(5)

四、编辑WebTest3、添加提取规则和自定义提取规则添加提取规则1、当必须从特定页中捕获一部分数据并且供另一个页使用时&#xff0c;就需要用到提取规则。可以使用提取规则从响应中复制字符串&#xff0c;然后将字符串存储到上下文变量中&#xff0c;以供任何后续请求使用。通过…

html里面怎么ul加高度,div里面嵌套了ul,为什么div的高度小于ul高度

div高度见阴影部分ul高度见阴影部分实现的html代码如下&#xff1a;热门推荐css代码如下&#xff1a;.navBar {clear: both;width: 100%;border: solid;/*border-top: solid;*/border-bottom: solid;border-width: 1px;border-color: #dddddd;margin:0px;height: 1.5em;}.navBa…

Asp.net2.0水晶报表的一些示例源码

最近关注了一下Asp.net2.0中水晶报表的资料&#xff0c;发现示例少之又少&#xff08;怀疑是水晶报表免费的比较少的缘故&#xff09;&#xff0c;搜集到了Asp.net官方的许多示例源码&#xff0c;试了几个还不错&#xff0c;这里发给大家分享一下&#xff08;我仅把Asp.net C#部…

计算机网络作业6,计算机网络作业 6

请回答下列问题&#xff1a;(1)主机在配置IP地址时&#xff0c;其正确的子网掩码和默认网关分别是多少&#xff1f;(2)若路由器R在向互联网转发一个由主机192.168.1.5发送、ID12345、length500B、DF1的IP分组时&#xff0c;则该IP分组首部的哪些字段会被修改&#xff1f;如何修…

QQ2007 Beta2 下载地址泄露

QQ2007 Beta2地址的地址已经泄露,来自腾讯官方论坛的一位能体验的朋友.安装完要求重启电脑,不过貌似目前非相关测试人员无法登录这个版本,当然聪明的网友们还是会自己想办法搞定 :)尊敬的QQ用户,您幸运地被腾讯公司选中参与QQ2007Beta2试用,我们很高兴有这个机会可以让小部分用…

画江恩线

有同学问江恩线的画法。俺这次讲仔细了。希望喜欢江恩理论的同学们都可以学会了。因为讲一次很麻烦的。上图是大盘周线图的江恩线。 江恩理论的核心是用历史来发现未来。所以想学习江恩理论的同学必须明白这其中的关键。凡是没有这历史未来观的江恩理论学习都是瞎扯淡。就像缠…

Javascript 仿Flash 图片切换 及 Flash 图片切换

1。 Javascript 仿Flash 图片切换 http://www.fansart.com/cweb/200669141456.asp<a target_self href"javascript:goUrl()"><span class"f14b"><script type"text/javascript">imgUrl1"http://www.fansart.com/qiehuan/…

计算机领域hpec会议,2018 IEEE High Performance extreme Computing Conference HPEC

The IEEE High Performance Extreme Computing Conference (HPEC ’18) will be held in the Greater Boston Area, Massachusetts, USA on 25 – 27 September 2018. The HPEC charter is to be the premier conference in the world on the confluence of HPC and Embedded …