2. Peter Gfader Specializes in C# and .NET (Java not anymore) TestingAutomated tests Agile, ScrumCertified Scrum Trainer Technology aficionado Silverlight ASP.NET Windows Forms
5. SQL Management Studio SQL Configuration Manager Consoles SQLCMD PowerShell SQL Profiler SQL Database Tuning Advisor Last Week
6. How to setup maintenance plans over night Database encryption Data Source code (Stored procs) Best practices Typical maintenance plans Policies Last Week - Additional
8. Encrypting data - Transparent Data Encryption (TDE) http://msdn.microsoft.com/en-us/library/bb934049.aspx http://www.acorns.com.au/blog/?p=147 Encrypting Connections to SQL Server http://msdn.microsoft.com/en-us/library/ms189067.aspx Encrypting source code http://www.codeproject.com/KB/database/ProtectSQLCodeObject.aspx Database encryption
9. http://ola.hallengren.com/ Steps Backup Integrity check Index optimization Solution used in mission-critical environments in many organizations. Best practices - Maintenance
10. Security Best Practices http://download.microsoft.com/download/8/5/e/85eea4fa-b3bb-4426-97d0-7f7151b2011c/SQL2005SecBestPract.doc Security Best Practices Checklist http://technet.microsoft.com/en-us/library/cc966456.aspx Best practices - Security
11. Create a schema called Salary Create a table called Employees in Schema Create a user called Manager Give only manager permission to update/insert/delete in schema Create a user called Peter Give Peter only read to schema (=salary) Create a user Alice Deny everything for Alice in Salary Homework?
12. Agenda New Data Types Inline variable assignment Table Value Parameters DDL Triggers CTE (Common Table Expressions) TOP %, XML Queries PIVOT/UNPIVOT ADO.NET
13. Datatypes - Exact Numerics bigint, int, smallint, tinyint -2^63 ... 2^63-1 0..255 Bit (0 or 1) decimal = numeric Exact type Numbers -10^38 +1 ... 10^38 – Money, smallmoney accuracy to a ten-thousandth money unit Smallmoney = smaller money
17. Date and Time SQL 2008 now has the following data types to represent time: DateTime SmallDateTime Date Time DateTime2 – really a BigDateTime Min Date is 1st Jan 0000 Max date 31st Dec 9999 – Y10K BUG!! DateTimeOffset
19. Datatypes - Other cursor table Timestamp = rowversion binary number Reflects data modifications uniqueidentifier = Guid Format: 04c4ce04-16c1-406f-a895-5dd321db7f0b
20. New Data Types Filestream Sparse Columns Filtered Indexes Spatial Data HierarchyID DATE and TIME data types
21. Example: Storing images I am designing an Employee table that needs to cater for employee photographs. What should I do?
22. blob vs. file system I am designing an Employee table that needs to cater for employee photographs. What should I do? You can store the image in the database (blob) You can store a URL to the image in the database (Recommended for SQL2005) http://www.ssw.com.au/ssw/standards/Rules/RulestoBetterSQLServerdatabases.aspx#ImageReplaceWithURL
23.
24.
25. Filestream Filestream to the rescue Implemented as a special varbinary(max) where data is stored as a blob on the file system Allows you to have transactionally consistent Integrated backup and restore of your binary images Size limitation is the size of your hard drive’s free space
26. Problem Q:I’ve got an Contacts table with 200,000 rows. To support the latest Web 2.0 trends we want to also record the contact’s blog address. What should I do?
28. Solution? A:Just add a new BlogUrl column in Q:What’s the problem with that? A:Most of the entries in your table will be null, it wastes a lot of database space
29. Solution Use a sparse column These columns are new to SQL 2008 They are optimized for storing NULL values
33. Filtered Indexes Allows you to add an index to a column with a where clause Useful for indexing columns with null values in them
34. Spatial Data Types Geometry Geography Virtual Earth Integration Planar vs Geodetic Algorithms Separate install for spatial assemblies http://www.conceptdevelopment.net/Database/Geoquery/
36. Spatial Data Types Geometry allows you to represent and process polygons
37. How do I represent an Org Chart? Employee with a ManagerID column (self join) New HierarchyID data type Can be indexed using: Depth First Breadth First
38. Depth First Search A depth-first index, rows in a subtree are stored near each other. For example, all employees that report through a manager are stored near their managers' record.
39. Breadth First Search A breadth-first stores the rows each level of the hierarchy together. For example, the records of employees who directly report to the same manager are stored near each other.
41. Table Value Parameters Pass in a table as an argument to a SPROC Instead of: exec sp_MySproc 'murphy,35;galen,31;samuels,27;colton,42‘ SPROC needs to then parse that string
42. Table Value Parameters You can do this instead CREATE TYPE PeepsType AS TABLE (Name varchar(20), Age int) DECLARE @myPeeps PeepsType INSERT @myPeeps SELECT 'murphy', 35 INSERT @myPeeps SELECT 'galen', 31 INSERT @myPeeps SELECT 'samuels', 27 INSERT @myPeeps SELECT 'colton', 42exec sp_MySproc2 @myPeeps
43. Table Value Parameters The SPROC would look like this: CREATE PROCEDURE sp_MySproc2(@myPeeps PeepsType READONLY)
48. More features ROW NUMBER – see example TRY/Catch in queries – see example Top % WITH TIES select top with tie feature( if top 10 and there are 15 that match number 10 will bring back all 15)
49. Working with XML - RAW SELECT TOP 3 Person.FirstName, Person.LastName, PersonPhone.PhoneNumber FROM AdventureWorks.Person.Person INNER JOIN AdventureWorks.Person.PersonPhone ON PersonPhone.BusinessEntityID = Person.BusinessEntityID FOR XML RAW
50. Working with XML - RAW <row FirstName="Ken" LastName="Sánchez" PhoneNumber="697-555-0142"/> <row FirstName="Terri" LastName="Duffy" PhoneNumber="819-555-0175"/> <row FirstName="Roberto" LastName="Tamburello" PhoneNumber="212-555-0187"/>
51. Working with XML - RAW What happened to our relationships? RAW doesn’t show our table relationships but gives us a flat XML hierarchy
52. Working with XML - Auto SELECT TOP 3 Person.FirstName, Person.LastName, PersonPhone.PhoneNumber FROM AdventureWorks.Person.Person INNER JOIN AdventureWorks.Person.PersonPhone ON PersonPhone.BusinessEntityID = Person.BusinessEntityID FOR XML AUTO
53. Working with XML - Auto <AdventureWorks.Person.PersonFirstName="Ken" LastName="Sánchez"> <AdventureWorks.Person.PersonPhonePhoneNumber="697-555-0142"/> </AdventureWorks.Person.Person>
54. Working with XML - Auto Great, but what if I needed to format the XML to output into a certain schema
55. Working with XML - Explicit SELECT TOP 3 1 AS TAG, NULL AS PARENT, BusinessEntityID AS [Person!1!BusinessEntityID], FirstName AS [Person!1!FirstName!ELEMENT] FROM AdventureWorks.Person.Person FOR XML EXPLICIT
56. Working with XML - Explicit <Person BusinessEntityID="285“> <FirstName>Syed</FirstName> </Person> <Person BusinessEntityID="293"> <FirstName>Catherine</FirstName> </Person> <Person BusinessEntityID="295"> <FirstName>Kim</FirstName> </Person>
57. Working with XML - Explicit Can control how the XML gets output Ugly query Is there a better way?
58. Working with XML - PATH SELECT TOP 3 BusinessEntityID "Person/@BusinessEntityID", FirstName "Person/FirstName" FROM AdventureWorks.Person.Person FOR XML PATH ('')
59. Working with XML - XQuery XQuery is a query language for XML Data
60. XQuery – Declaring our XML string DECLARE @x XML SET @x = '<christmaslist><person name = "betty" gift = "camera"/><person name = "zach" gift = "elmo doll"/><person name = "brad" gift = "socks"/></christmaslist>'
64. ADO.NET ADO.NET gives you full control over how you access and retrieve data from the data source Strongly typed data sets Work in disconnected mode
65. ADO.NET SQLConnection Manages the connection to the database SQLCommand Defines the data to be read, updated etc. SQLDataAdapter Runs the SQLCommand against the database DataSet A complete in-memory copy of the data (tables, relationships, data types…) Search, filter, navigate your data – without even being connected to the database!
67. Resources 1/2 Spatial Data playground http://www.conceptdevelopment.net/Database/Geoquery/ Hidden Features in SQL Server http://stackoverflow.com/questions/121243/hidden-features-of-sql-server Top 10 Hidden Gems in SQL Server http://technet.microsoft.com/en-au/library/cc917696.aspx
68. What to do when you take over a new SQL Server box? http://www.brentozar.com/sql/blitz-minute-sql-server-takeovers/ Resources 2/2
69. Session 2 Lab T-SQL Enhancements Download from Course Materials Site (to copy/paste scripts) or type manually http://sharepoint.ssw.com.au/training/UTSSQL/
70. Where Else Can I Get Help? Where else can I get help? Free chats and webcasts List of newsgroups Microsoft community sites Community events and columns www.microsoft.com/technet/community
72. Thank You! Gateway Court Suite 10 81 - 91 Military Road Neutral Bay, Sydney NSW 2089 AUSTRALIA ABN: 21 069 371 900 Phone: + 61 2 9953 3000 Fax: + 61 2 9953 3105 info@ssw.com.auwww.ssw.com.au
Editor's Notes
Java current version 1.6 Update 171.7 released next year 2010Dynamic languages Parallel computingMaybe closures
TEST that I will do:1. Create a new table called Bonus in schema Salary2. Login as Alice and try to access Bonus (with all permissions on Bonus)--> Should not be able to
decimalFixed precision and scale numeric data from -10^38 +1 through 10^38 –1. numericFunctionally equivalent to decimal.moneyMonetary data values from -2^63 (-922,337,203,685,477.5808) through 2^63 - 1 (+922,337,203,685,477.5807), with accuracy to a ten-thousandth of a monetary unit.smallmoneyMonetary data values from -214,748.3648 through +214,748.3647, with accuracy to a ten-thousandth of a monetary unit.
Date = 3 bytes only DateDate– Enthält nur den Datumswert– Feste Größe von 3 byte– Spanne: 01.01.0001 – 31.12.9999– Bsp: 13-11-2008 oder 2008-11-13Time(n)– Enthält nur den Zeitwert– Variable Größe von 3-5 byte–Genauigkeit bis zu 100 Nanosekunden möglich– Bsp: 08:15:30.11223DateTimeOffset(n)– Enthält Datum und Uhrzeit inklusive der Zeitzonenverschiebung– Variable Größe von 8-10 byte–Genauigkeit bis zu 100 Nanosekunden möglich– Bsp: 2008-11-13 08:15:30.11223 01:00DateTime2(n)– Kombination aus Date und Time Datentyp– Variable Größe von 6-8 byte–Genauigkeit bis zu 100 Nanosekunden möglich– Spanne: 01.01.0001 – 31.12.9999– Bsp: 13-11-2008 08:15:30.11223
Needs NTFSTransaction saveNo datasize limitBackup works
USE AdventureWorksGO CREATE TABLE DocumentStore(DocIDint PRIMARY KEY, Title varchar(200) NOT NULL,ProductionSpecificationvarchar(20) SPARSE NULL,ProductionLocationsmallintSPARSE NULL,MarketingSurveyGroupvarchar(20) SPARSE NULL ) ;GO
Sparse columns require more storage space for nonnull values than the space required for identical data that is not marked SPARSE. The following tables show the space usage for each data type. The NULL Percentage column indicates what percent of the data must be NULL for a net space savings of 40 percent.
Clustered Index – Index that configures internal sorting of table(Can be only one on table)
http://technet.microsoft.com/en-us/magazine/cc434692(TechNet.10).aspxhttp://msdn.microsoft.com/en-us/library/bb630263.aspxSELECT OrgNode.ToString() AS LogicalNode, * FROM NewOrgORDER BY LogicalNode;GO
A Common Table Expression (CTE) is a temporary result set derived from a simple query. A CTE can be used in many of the same ways you use a derived table. CTEs can also contain references to themselves. This allows database developers to write recursive queries. CTEs can also be used in place of views.
XML Output – see exampleselect TOP 10 WITH TIES * from AdventureWorks.Person.ContactORDER BY Titleselect ROW_NUMBER() over(order by FirstName), *from AdventureWorksLT.SalesLT.Customerorder by FirstName
* The query() method is useful for extracting parts of an XML instance. The XQuery expression evaluates to a list of XML nodes. The subtree rooted at each of these nodes is returned in document order. The result type is untyped XML. * The value() method extracts a scalar value from an XML instance. It returns the value of the node the XQuery expression evaluates to. This value is converted to a Transact-SQL type specified as the second argument of the value() method. * The exist() method is useful for existential checks on an XML instance. It returns 1 if the XQuery expression evaluates to non-null node list; otherwise it returns 0. * The nodes() method yields instances of a special XML data type, each of which has its context set to a different node that the XQuery expression evaluates to. The special XML data type supports the query(), value(), nodes(), and exist() methods, and can be used in count(*) aggregations and NULL checks. All other uses result in an error. * The modify() method permits modifying parts of an XML instance, such as adding or deleting subtrees, or replacing scalar values such as the price of a book from 9.99 to a 39.99.
-- Return rows in a random orderSELECT SomeColumnFROM SomeTableORDER BY NEWID()-- repeat 10 timesPRINT 'X'GO 10