Download presentation
Presentation is loading. Please wait.
Published byDominique Forland Modified over 9 years ago
1
Peter DeBetta SQL Server 2008 New Features for Developers
2
Introduction Peter DeBetta Trainer, Programmer, Architect, Consultant, Author MSDN Magazine Microsoft MVP – SQL Server Introduction to SQL Server 2005 for Developers Introduction to SQL Server 2008 SQLblog (http://www.sqlblog.com)http://www.sqlblog.com
3
Overview Transact-SQL Enhancements Assignment & Row Constructors Table-valued Parameters Merge Grouping Sets CLR Improvements New and Enhanced Data Types Data and Time HierarchyID Spatial data Filestream Other Features
4
Assignment Operators New Incremental Assignment Operators Addition: += Subtraction: -= Multiplication: *= Division: /= Modulo: %= Declare and assign in a single statement Can use previously defined variables or static values Cannot use incremental assignment operators
5
USE AdventureWorks; GO UPDATE Production.Product SET ListPrice *= 1.05 OUTPUT inserted.ProductID, deleted.ListPrice AS OldPrice, inserted.ListPrice AS NewPrice WHERE ProductID = 680; USE AdventureWorks; GO UPDATE Production.Product SET ListPrice *= 1.05 OUTPUT inserted.ProductID, deleted.ListPrice AS OldPrice, inserted.ListPrice AS NewPrice WHERE ProductID = 680; Assignment Operators
6
DECLARE @i INT = 10 DECLARE @xml XML = ' A B ' DECLARE @i INT = 10 DECLARE @n INT += @i –Incremental Assignment not valid in DECLARE SELECT @i, @n DECLARE @i INT = 10 DECLARE @n INT = @i + 8 SET @n -= @i SET @i *= 2 SELECT @i, @n DECLARE @i INT = 10 DECLARE @xml XML = ' A B ' DECLARE @i INT = 10 DECLARE @n INT += @i –Incremental Assignment not valid in DECLARE SELECT @i, @n DECLARE @i INT = 10 DECLARE @n INT = @i + 8 SET @n -= @i SET @i *= 2 SELECT @i, @n Assignment Operators
7
Row Constructors VALUES clause can now return multiple rows as a single [atomic] table When used with a CTE Replaces the need to define and insert into a Temporary table Table variable When used with INSERT Replaces the SELECT … UNION ALL SELECT … methodology for loading multiple rows into a table
8
CREATE TABLE AutomatedPolicyExecutionMode ( ModeId INT NOT NULL PRIMARY KEY, ModeName VARCHAR(100) ) GO INSERT INTO AutomatedPolicyExecutionMode (ModeId, ModeName) VALUES (0, 'On demand'), (1, 'Enforce Compliance'), (2, 'Check on change and log'), (4, 'Check on schedule and log‘) CREATE TABLE AutomatedPolicyExecutionMode ( ModeId INT NOT NULL PRIMARY KEY, ModeName VARCHAR(100) ) GO INSERT INTO AutomatedPolicyExecutionMode (ModeId, ModeName) VALUES (0, 'On demand'), (1, 'Enforce Compliance'), (2, 'Check on change and log'), (4, 'Check on schedule and log‘) Row Constructors
9
;WITH AutomatedPolicyExecutionMode (ModeId, ModeName) AS (SELECT * FROM (VALUES (0, 'On demand'), (1, 'Enforce Compliance'), (2, 'Check on change and log'), (4, 'Check on schedule and log') ) AS EM(ModeId, ModeName) ) SELECT pmf.[management_facet_id] AS FacetID, pmf.[name] AS FacetName, APEM.[ModeName] FROM syspolicy_management_facets AS pmf INNER JOIN AutomatedPolicyExecutionMode AS APEM ON pmf.[execution_mode] & APEM.[ModeId] = APEM.[ModeId] ORDER BY pmf.[name], APEM.[ModeId] Row Constructors
10
Table-Valued Parameters New user-defined table type Reusable table definition for table variables Can define local variable of table type Instead of defining table structure, use table type instead You cannot use a table-valued parameter as target of a SELECT INTO or INSERT EXEC statement
11
Table-Valued Parameters Stored Procedures and User-Defined Functions can use table type as input parameter Must be read-only (no DML on table-valued parameters) Cannot be used for output SQL Server does not maintain statistics on columns of table- valued parameters. Locks are not acquired when initially populating table-valued parameter data from a client Do not cause a statement to recompile
12
CREATE TYPE dbo.NewPerson AS TABLE ( PersonID INT NOT NULL PRIMARY KEY, FirstName VARCHAR(20) NOT NULL, LastName VARCHAR(30) NOT NULL ); GO DECLARE @T AS dbo.NewPerson; INSERT INTO @T(PersonID, FirstName, LastName) VALUES(1, 'Peter', 'DeBetta'),(2, 'Adam', 'Machanic'),(3, 'Jane', 'Doe') SELECT * FROM @T; CREATE TYPE dbo.NewPerson AS TABLE ( PersonID INT NOT NULL PRIMARY KEY, FirstName VARCHAR(20) NOT NULL, LastName VARCHAR(30) NOT NULL ); GO DECLARE @T AS dbo.NewPerson; INSERT INTO @T(PersonID, FirstName, LastName) VALUES(1, 'Peter', 'DeBetta'),(2, 'Adam', 'Machanic'),(3, 'Jane', 'Doe') SELECT * FROM @T; Table-Valued Parameters
13
CREATE PROC dbo.prPersonDetail (@T AS dbo.NewPerson READONLY) AS SELECT C.* FROM Person.Contact AS C INNER JOIN @T AS T ON C.ContactID = T.PersonID; GO DECLARE @MyPeople AS dbo.NewPerson; INSERT INTO @MyPeople(PersonID, FirstName, LastName) VALUES(1, 'Peter', 'DeBetta'),(2, 'Adam', 'Machanic'),(3, 'Jane', 'Doe') EXEC dbo.prPersonDetail @T = @MyPeople; CREATE PROC dbo.prPersonDetail (@T AS dbo.NewPerson READONLY) AS SELECT C.* FROM Person.Contact AS C INNER JOIN @T AS T ON C.ContactID = T.PersonID; GO DECLARE @MyPeople AS dbo.NewPerson; INSERT INTO @MyPeople(PersonID, FirstName, LastName) VALUES(1, 'Peter', 'DeBetta'),(2, 'Adam', 'Machanic'),(3, 'Jane', 'Doe') EXEC dbo.prPersonDetail @T = @MyPeople; Table-Valued Parameters
14
MERGE The mythical UPSERT An single, atomic operation that combines the functionality of INSERT, UPDATE, and DELETE Semicolon terminator is required! $action returns action type as string INSERT, UPDATE, DELETE If you define an INSTEAD OF trigger for any action on the target table, there must be an INSTEAD OF trigger for all actions on the target table.
15
MERGE [ AS table_alias ] USING ON [WHEN MATCHED [ AND ] THEN {UPDATE… | DELETE} ] [WHEN NOT MATCHED BY TARGET [ AND ] THEN INSERT… ] [WHEN NOT MATCHED BY SOURCE [ AND ] THEN {UPDATE… | DELETE} ] ; MERGE [ AS table_alias ] USING ON [WHEN MATCHED [ AND ] THEN {UPDATE… | DELETE} ] [WHEN NOT MATCHED BY TARGET [ AND ] THEN INSERT… ] [WHEN NOT MATCHED BY SOURCE [ AND ] THEN {UPDATE… | DELETE} ] ; MERGE Syntax
16
MERGE MERGE does outer joins between the target and source data as needed. WHEN NOT MATCHED BY TARGET performs an outer join from the source table to the target table WHEN NOT MATCHED BY SOURCE performs an outer join from the target table to the source table. When using both the WHEN NOT MATCHED BY TARGET and WHEN NOT MATCHED BY SOURCE clauses in a single MERGE statement A full outer join is used!!!
17
MERGE WHEN MATCHED Find matches between the target and source tables Can either perform an UPDATE or DELETE against the target table Can be used at most two times in the MERGE statement WHEN NOT MATCHED BY TARGET The keyword TARGET is optional, although I suggest being explicit Determine if there are rows in the source table that don’t exist in the target. This is the only WHEN clause that can INSERT data into the source table Can be used at most one time in the MERGE statement
18
MERGE WHEN NOT MATCHED BY SOURCE Find rows in the target table that do not exist in the source table Can be used at most two times in the MERGE statement. If used twice the following also applies The two clauses are processed in order One clause must UPDATE and the other one must DELETE (order is not important) The second clause is checked only if the first is not satisfied The first clause must specify additional criteria: If you attempt to execute without specifying additional search criteria for the first clause, you will receive an error.
19
WITH CustSales (CustomerID, MaxOrderDate, TotalDueTotal) AS (SELECT CustomerID, MAX(OrderDate), SUM(TotalDue) FROM SalesLT.SalesOrderHeader GROUP BY CustomerID) MERGE SalesLT.CustomerTotals AS ct USING CustSales ON CustSales.CustomerID = ct.CustomerID WHEN MATCHED THEN UPDATE SET LastOrderDate = cs.MaxOrderDate, SalesTotal = cs.TotalDueTotal WHEN NOT MATCHED BY SOURCE THEN DELETE WHEN NOT MATCHED BY TARGET THEN INSERT (CustomerID, LastOrderDate, SalesTotal) VALUES (CustSales.CustomerID, CustSales.MaxOrderDate, CustSales.TotalDueTotal); OUTPUT $action, deleted.*, inserted.*; WITH CustSales (CustomerID, MaxOrderDate, TotalDueTotal) AS (SELECT CustomerID, MAX(OrderDate), SUM(TotalDue) FROM SalesLT.SalesOrderHeader GROUP BY CustomerID) MERGE SalesLT.CustomerTotals AS ct USING CustSales ON CustSales.CustomerID = ct.CustomerID WHEN MATCHED THEN UPDATE SET LastOrderDate = cs.MaxOrderDate, SalesTotal = cs.TotalDueTotal WHEN NOT MATCHED BY SOURCE THEN DELETE WHEN NOT MATCHED BY TARGET THEN INSERT (CustomerID, LastOrderDate, SalesTotal) VALUES (CustSales.CustomerID, CustSales.MaxOrderDate, CustSales.TotalDueTotal); OUTPUT $action, deleted.*, inserted.*; MERGE Example
20
Grouping Sets Grouping sets are literally a set of grouping columns Enhancements related to grouping sets GROUP BY sub-clauses GROUPING SETS: Manual list of sets CUBE: 2n grouping sets constructed from n elements, creates aggregate values for all elements ROLLUP: n+1 grouping sets constructed from n elements, creates aggregate values for elements from right to left in sub-clause New GROUPING_ID function identifies grouping set association
21
SELECT C1, C2, C3, SomeAgg(C4) FROM T GROUP BY ROLLUP(C1, C2, C3) -- is equivalent to SELECT C1, C2, C3, SomeAgg(C4) FROM T GROUP BY GROUPING SETS ( (C1, C2, C3),(C1, C2),(C1),() ) -- is equivalent to SELECT C1, C2, C3, SomeAgg(C4) FROM T GROUP BY (C1, C2, C3) UNION ALL SELECT C1, C2, NULL, SomeAgg(C4) FROM T GROUP BY (C1, C2) UNION ALL SELECT C1, NULL, NULL, SomeAgg(C4) FROM T GROUP BY(C1) UNION ALL SELECT NULL, NULL, NULL, SomeAgg(C4) FROM T SELECT C1, C2, C3, SomeAgg(C4) FROM T GROUP BY ROLLUP(C1, C2, C3) -- is equivalent to SELECT C1, C2, C3, SomeAgg(C4) FROM T GROUP BY GROUPING SETS ( (C1, C2, C3),(C1, C2),(C1),() ) -- is equivalent to SELECT C1, C2, C3, SomeAgg(C4) FROM T GROUP BY (C1, C2, C3) UNION ALL SELECT C1, C2, NULL, SomeAgg(C4) FROM T GROUP BY (C1, C2) UNION ALL SELECT C1, NULL, NULL, SomeAgg(C4) FROM T GROUP BY(C1) UNION ALL SELECT NULL, NULL, NULL, SomeAgg(C4) FROM T Grouping Sets Equivalents
22
GROUP BY CUBE (C1, C2, C3) -- is equivalent to GROUP BY GROUPING SETS ( (C1, C2, C3),(C1, C2),(C1, C3),(C2, C3),(C1),(C2),(C3),() ) GROUP BY CUBE (C1, C2, C3) -- is equivalent to GROUP BY GROUPING SETS ( (C1, C2, C3),(C1, C2),(C1, C3),(C2, C3),(C1),(C2),(C3),() ) Grouping Sets Equivalents
23
SELECT S.TerritoryID, Year(S.OrderDate) AS SaleYear, SUM(S.TotalDue) AS TotalDueTotal FROM Sales.SalesOrderHeader AS S GROUP BY CUBE(TerritoryID, Year(S.OrderDate)) -- is equivalent to SELECT S.TerritoryID, Year(S.OrderDate) AS SaleYear, SUM(S.TotalDue) AS TotalDueTotal FROM Sales.SalesOrderHeader AS S GROUP BY GROUPING SETS ((TerritoryID, Year(S.OrderDate)), (Year(S.OrderDate)), (TerritoryID), ()) SELECT S.TerritoryID, Year(S.OrderDate) AS SaleYear, SUM(S.TotalDue) AS TotalDueTotal FROM Sales.SalesOrderHeader AS S GROUP BY CUBE(TerritoryID, Year(S.OrderDate)) -- is equivalent to SELECT S.TerritoryID, Year(S.OrderDate) AS SaleYear, SUM(S.TotalDue) AS TotalDueTotal FROM Sales.SalesOrderHeader AS S GROUP BY GROUPING SETS ((TerritoryID, Year(S.OrderDate)), (Year(S.OrderDate)), (TerritoryID), ()) Grouping Sets Examples
24
CLR Enhancements In SQL Server 2005, UDTs are limited to 8000 bytes In SQL Server 2008, UDTs can be up to 2GB. Essentially varbinary(max) UDT define their size Large UDTs can have a size of -1 (equivalent to “max”) This size will be reflected as -1 in type metadata Large UDTs will be converted to varbinary(max) or image as needed for clients
25
Date and Time Data Type Data typeFormatRangeAccuracyStorage size (bytes)Time zone offset time [(7)]hh:mm:ss[.nnnnnnn] 00:00:00.0000000 through 23:59:59.9999999 100 nanoseconds3 to 5No dateYYYY-MM-DD 0001-01-01 through 9999-12-31 1 day3No smalldatetime YYYY-MM-DD hh:mm:ss 1900-01-01 through 2079-06-06 1 minute4No datetime YYYY-MM-DD hh:mm:ss[.nnn] 1753-01-01 through 9999-12-31 0.00333 second8No datetime2[(7)] YYYY-MM-DD hh:mm:ss[.nnnnnnn] 0001-01-01 00:00:00.0000000 through 9999-12-31 23:59:59.9999999 100 nanoseconds6 to 8No datetimeoffset[(7)] YYYY-MM-DD hh:mm:ss[.nnnnnnn] [+|-]hh:mm 0001-01-01 00:00:00.0000000 through 9999-12-31 23:59:59.9999999 (in UTC) 100 nanoseconds8 to 10Yes
26
Date and Time Data Type New functions SYSDATETIME SYSUTCDATETIME SYSDATETIMEOFFSET TODATETIMEOFFSET SWITCHOFFSET DATEPART and DATENAME “part” additions microsecond Nanosecond TZoffset ISO_WEEK
27
HIERARCHYID Data Type New system CLR type supporting trees Uses a materialized path methodology Underlying binary representation of path HierarchyID methods GetRoot,GetAncestor, GetDescendant GetLevel, IsDescendant Reparent (move a node) Parse, ToString
28
CREATE TABLE HumanResources.EmployeeOrg ( OrgNode hierarchyid PRIMARY KEY CLUSTERED, -- depth OrgLevel AS OrgNode.GetLevel() PERSISTED, EmployeeID int UNIQUE NOT NULL, EmpName varchar(20) NOT NULL, Title varchar(20) NULL ) ; GO CREATE UNIQUE INDEX EmployeeOrgNc1 --breadth ON HumanResources.EmployeeOrg(OrgLevel, OrgNode) ; CREATE TABLE HumanResources.EmployeeOrg ( OrgNode hierarchyid PRIMARY KEY CLUSTERED, -- depth OrgLevel AS OrgNode.GetLevel() PERSISTED, EmployeeID int UNIQUE NOT NULL, EmpName varchar(20) NOT NULL, Title varchar(20) NULL ) ; GO CREATE UNIQUE INDEX EmployeeOrgNc1 --breadth ON HumanResources.EmployeeOrg(OrgLevel, OrgNode) ; HIERARCHYID Data Type
29
-- From SQL Server Books Online CREATE PROC prAddEmp(@mgrid int, @empid int, @e_name varchar(20), @title varchar(20)) AS BEGIN DECLARE @mOrgNode hierarchyid, @lc hierarchyid SELECT @mOrgNode = OrgNode FROM HumanResources.EmployeeOrg WHERE EmployeeID = @mgrid SET TRANSACTION ISOLATION LEVEL SERIALIZABLE BEGIN TRANSACTION SELECT @lc = max(OrgNode) FROM HumanResources.EmployeeOrg WHERE OrgNode.GetAncestor(1) = @mOrgNode ; INSERT HumanResources.EmployeeOrg (OrgNode, EmployeeID, EmpName, Title) VALUES(@mOrgNode.GetDescendant(@lc, NULL), @empid, @e_name, @title) COMMIT END -- From SQL Server Books Online CREATE PROC prAddEmp(@mgrid int, @empid int, @e_name varchar(20), @title varchar(20)) AS BEGIN DECLARE @mOrgNode hierarchyid, @lc hierarchyid SELECT @mOrgNode = OrgNode FROM HumanResources.EmployeeOrg WHERE EmployeeID = @mgrid SET TRANSACTION ISOLATION LEVEL SERIALIZABLE BEGIN TRANSACTION SELECT @lc = max(OrgNode) FROM HumanResources.EmployeeOrg WHERE OrgNode.GetAncestor(1) = @mOrgNode ; INSERT HumanResources.EmployeeOrg (OrgNode, EmployeeID, EmpName, Title) VALUES(@mOrgNode.GetDescendant(@lc, NULL), @empid, @e_name, @title) COMMIT END HIERARCHYID – Add Child Node
30
--Sariya's subordinates DECLARE @CurrentEmployee hierarchyid SELECT @CurrentEmployee = OrgNode FROM HumanResources.EmployeeOrg WHERE EmployeeID = 46 ; SELECT * FROM HumanResources.EmployeeOrg WHERE @CurrentEmployee.IsDescendant(OrgNode) = 1 ; -- Path Presentation SELECT REPLICATE(' | ', OrgLevel) + EmpName AS EmpName, OrgNode.ToString() AS OrgPath FROM HumanResources.EmployeeOrg ORDER BY OrgNode; --Sariya's subordinates DECLARE @CurrentEmployee hierarchyid SELECT @CurrentEmployee = OrgNode FROM HumanResources.EmployeeOrg WHERE EmployeeID = 46 ; SELECT * FROM HumanResources.EmployeeOrg WHERE @CurrentEmployee.IsDescendant(OrgNode) = 1 ; -- Path Presentation SELECT REPLICATE(' | ', OrgLevel) + EmpName AS EmpName, OrgNode.ToString() AS OrgPath FROM HumanResources.EmployeeOrg ORDER BY OrgNode; HIERARCHYID Data Type – Querying
31
Geodetic Type New GEOGRAPHY data type GEOGRAPHY can store instances of various types Points Line strings Polygons Collections of the above Methods for computing Spatial relationships: intersects, disjoint, etc. Spatial constructions: intersection, union, etc. Metric functions: distance, area
32
Planar Type New GEOMETRY data type GEOMETRY can store instances of various types Points Line strings Polygons Collections of the above Methods for computing Spatial relationships: intersects, disjoint, etc. Spatial constructions: intersection, union, etc. Metric functions: distance, area
33
Spatial Types Following Open Geospatial Consortium (OGC) Simple features for SQL Single type implementation Same type represents points, lines, polygons Exposed as a system CLR type Based on CLR code and built in to SQL Server 2008 Does not require “clr enabled” to use Assembly available for managed access
34
CREATE TABLE SpatialTable ( id int IDENTITY (1,1), GeomColumn geometry ) INSERT INTO SpatialTable (GeomCol1) VALUES (geometry::STGeomFromText('LINESTRING (0 2, 2 0, 4 2)', 0)); DECLARE @g geometry; SET @g = geometry::STGeomFromText('POINT(1 1)', 0); SELECT @g.STIntersects(@h) FROM SpatialTable WHERE GeomColumn.STIntersects(@g) CREATE TABLE SpatialTable ( id int IDENTITY (1,1), GeomColumn geometry ) INSERT INTO SpatialTable (GeomCol1) VALUES (geometry::STGeomFromText('LINESTRING (0 2, 2 0, 4 2)', 0)); DECLARE @g geometry; SET @g = geometry::STGeomFromText('POINT(1 1)', 0); SELECT @g.STIntersects(@h) FROM SpatialTable WHERE GeomColumn.STIntersects(@g) Spatial Example Code
35
What Spatial Types Cannot Do Raster data 3 dimensional Topology Points make up LineStrings LineStrings make up Polygons Network models Distance between cities along the road network
36
FILESTREAM BLOBs in the file system Managed by SQL Server You can use T-SQL to manage BLOB data or You can use Win32 APIs to work with the files PathName returns a virtual path as a token to a BLOB GET_FILESTREAM_TRANSACTION_CONTEXT() returns a session transaction token Use Win32 APIs The OpenSqlFilestream for the file handle ReadFile, WriteFile, TransmitFile, and so on… The application should close the handle by using CloseHandle
37
FileStream Must turn on filestream access Windows Layer SQL Server Configuration Manager SQL Instance Layer sp_configure 'filestream access' ValueDescription 0Disabled. This is the default value. 1 Enabled only for Transact-SQL access. 2 Enabled only for Transact-SQL and file I/O stream access.
38
FileStream New filegroup for storing BLOB data Filename is a path (not a file) Last folder in path must not exist Path up to last folder must exist On next slide, 'C:\test' must exist, but 'C:\test\Resumes' must not exist Table definition must also specify the blob data is using filestream Varbinary(max) column with FILESTREAM keyword
39
CREATE DATABASE......, FILEGROUP FileGroupName CONTAINS FILESTREAM ( NAME = FileStreamDBResumes, FILENAME = N'C:\test\Resumes' ) CREATE TABLE dbo.student ( student_id UNIQUEIDENTIFIER ROWGUIDCOL NOT NULL UNIQUE, Name varchar(25), Resume varbinary(max) FILESTREAM ); CREATE DATABASE......, FILEGROUP FileGroupName CONTAINS FILESTREAM ( NAME = FileStreamDBResumes, FILENAME = N'C:\test\Resumes' ) CREATE TABLE dbo.student ( student_id UNIQUEIDENTIFIER ROWGUIDCOL NOT NULL UNIQUE, Name varchar(25), Resume varbinary(max) FILESTREAM ); FileStream
40
Review Transact-SQL Enhancements Assignment & Row Constructors Table-valued Parameters Merge Grouping Sets CLR Improvements New and Enhanced Data Types Data and Time HierarchyID Spatial data Filestream Other Features
41
Questions
Similar presentations
© 2024 SlidePlayer.com Inc.
All rights reserved.