sql server - introduction to tsql
TRANSCRIPT
SQL Server 2008 for DevelopersUTS Short Course
Specializes in
C# and .NET (Java not anymore)
TestingAutomated tests
Agile, ScrumCertified Scrum Trainer
Technology aficionado • Silverlight• ASP.NET• Windows Forms
Peter Gfader
http://sharepoint.ssw.com.au/Training/UTSSQL/Pages/
Course Timetable Course Materials
Course Website
Course OverviewSession
Date Time Topic
1Tuesday03-08-2010
18:00 - 21:00
SQL Server 2008 Management Studio
2Tuesday10-08-2010
18:00 - 21:00
T-SQL Enhancements
3Tuesday17-08-2010
18:00 - 21:00
High Availability
4Tuesday24-08-2010
18:00 - 21:00
CLR Integration
5Tuesday31-08-2010
18:00 - 21:00
Full-Text Search
SQL Management Studio
SQL Configuration Manager
Consoles
SQLCMD PowerShell
SQL Profiler
SQL Database Tuning Advisor
Last Week
1. How to setup maintenance plans over night
2. Database encryption
1. Data2. Source code (Stored procs)
3. Best practices
1. Typical maintenance plans2. Policies
Last Week - Additional
1. Modify maintenance plan
2. 2nd page in wizard (new plan)
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 Serverhttp://msdn.microsoft.com/en-us/library/ms189067.aspx
Encrypting source codehttp://www.codeproject.com/KB/database/ProtectSQLCodeObject.aspx
Database encryption
http://ola.hallengren.com/
Steps• Backup• Integrity check • Index optimization
Solution used in• mission-critical environments in • many organizations.
Best practices - Maintenance
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
Create a schema called SalaryCreate a table called Employees in SchemaCreate a user called ManagerGive only manager permission to update/insert/delete in schemaCreate a user called PeterGive Peter only read to schema (=salary)Create a user AliceDeny everything for Alice in Salary
Homework?
New Data Types
Inline variable assignment
Table Value Parameters
DDL Triggers
CTE (Common Table Expressions)
TOP %, XML Queries
PIVOT/UNPIVOT
ADO.NET
Agenda
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
Datatypes - Exact Numerics
Floating point numeric data
float real
Datatypes – Approximate Numerics
char
Fixed length
varchar
Variable length
Datatypes - text
char, varchar, text
Ascii - 1 byte
nchar, nvarchar, ntext
Unicode - 2 bytes
binary, varbinary, image
Datatypes - text
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
Date and Time
Date Time details
Data type Format Range Accuracy Storage size (bytes)
User-defined fractional second precision
Time zone offset
time hh:mm:ss[.nnnnnnn]
00:00:00.0000000 through 23:59:59.9999999
100 nanoseconds
3 to 5 Yes No
date YYYY-MM-DD0001-01-01 through 9999-12-31
1 day 3 No No
smalldatetime
YYYY-MM-DD hh:mm:ss
1900-01-01 through 2079-06-06
1 minute 4 No No
datetime YYYY-MM-DD hh:mm:ss[.nnn]
1753-01-01 through 9999-12-31
0.00333 second 8 No No
datetime2 YYYY-MM-DD hh:mm:ss[.nnnnnnn]
0001-01-01 00:00:00.0000000 through 9999-12-31 23:59:59.9999999
100 nanoseconds
6 to 8 Yes No
datetimeoffset
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 nanoseconds
8 to 10 Yes Yes
cursor
table
Timestamp = rowversion
binary number Reflects data modifications
uniqueidentifier = Guid
Format: 04c4ce04-16c1-406f-a895-5dd321db7f0b
Datatypes - Other
Filestream
Sparse Columns
Filtered Indexes
Spatial Data
HierarchyID
DATE and TIME data types
New Data Types
I am designing an Employee table that needs to cater for employee photographs. What should I do?
Example: Storing images
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
blob vs. file system
You can store the image in the database (blob)
Database grows really bigBackups take longerYour code needs to convert the bytes back into an imageYour images are in sync with your data
blob
You can store a URL to the image in the database (Recommended for SQL2005)
Database is smallerEasily validate or change the image (you can look at it on the file system)Data could become out of sync with the file systemNeed to backup the database and the file system
File system
Filestream to the rescue
Implemented as a special varbinary(max) where data is stored as a blob on the file systemAllows you to have transactionally consistentIntegrated backup and restore of your binary imagesSize limitation is the size of your hard drive’s free space
Filestream
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?
Problem
A:\ Just add a new BlogUrl column in
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
Solution?
Use a sparse column
These columns are new to SQL 2008 They are optimized for storing NULL values
Solution
Sparse ColumnsData type Nonsparse bytes Sparse bytes NULL percentage
bit 0.125 4.125 98%
tinyint 1 5 86%
smallint 2 6 76%
int 4 8 64%
bigint 8 12 52%
real 4 8 64%
float 8 12 52%
smallmoney 4 8 64%
money 8 12 52%
smalldatetime 4 8 64%
datetime 8 12 52%
uniqueidentifier 16 20 43%
date 3 7 69%
Sparse ColumnsData type Nonsparse bytes Sparse bytes NULL Percentage
datetime2(0) 6 10 57%
datetime2(7) 8 12 52%
time(0) 3 7 69%
time(7) 5 9 60%
datetimetoffset(0) 8 12 52%
datetimetoffset (7) 10 14 49%
decimal/numeric(1,s)
5 9 60%
decimal/numeric(38,s)
17 21 42%
vardecimal(p,s) Use the decimal type as a conservative estimate.
Sparse ColumnsData type Nonsparse bytes Sparse bytes NULL Percentage
sql_variant Varies with the underlying data type
varchar or char 4+avg. data 2+avg. data 60%
nvarchar or nchar 4+avg. data 2+avg. data 60%
varbinary or binary 4+avg. data 2+avg. data 60%
xml 4+avg. data 2+avg. data 60%
hierarchyId 4+avg. data 2+avg. data 60%
Allows you to add an index to a column with a where clause
Useful for indexing columns with null values in them
Filtered Indexes
Geometry
Geography
Virtual Earth Integration
Planar vs Geodetic Algorithms
Separate install for spatial assemblies
http://www.conceptdevelopment.net/Database/Geoquery/
Spatial Data Types
Spatial Datatypes Hierarchy
Geometry allows you to represent and process polygons
Spatial Data Types
Employee with a ManagerID column (self join)
New HierarchyID data type
Can be indexed using:• Depth First • Breadth First
How do I represent an Org Chart?
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.
Depth 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.
Breadth First Search
Instead of:
DECLARE @myVar intSET @myVar = 5
You can:
DECLARE @myVar int = 5
Inline Variable Assignment
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
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
Table Value Parameters
The SPROC would look like this:
CREATE PROCEDURE sp_MySproc2(@myPeeps PeepsType READONLY)
Table Value Parameters
Auditing, regulating schema changes, capture events on create_table, alter_procedure, drop_login etc
DDL Triggers
PIVOT
CTE (Common Table Expression) Before
CTE (Common Table Expressions) After
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)
More features
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
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"/>
Working with XML - RAW
What happened to our relationships?
RAW doesn’t show our table relationships but gives us a flat XML hierarchy
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 AUTO
Working with XML - Auto
<AdventureWorks.Person.Person FirstName="Ken" LastName="Sánchez">
<AdventureWorks.Person.PersonPhone PhoneNumber="697-555-0142"/>
</AdventureWorks.Person.Person>
Working with XML - Auto
Great, but what if I needed to format the XML to output into a certain schema
Working with XML - Auto
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
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>
Working with XML - Explicit
Can control how the XML gets output
Ugly query
Is there a better way?
Working with XML - Explicit
SELECT TOP 3
BusinessEntityID "Person/@BusinessEntityID",
FirstName "Person/FirstName"
FROM AdventureWorks.Person.Person
FOR XML PATH ('')
Working with XML - PATH
XQuery is a query language for XML Data
Working with XML - XQuery
DECLARE @x XML
SET @x = '<christmaslist><person name = "betty" gift = "camera"/><person name = "zach" gift = "elmo doll"/><person name = "brad" gift = "socks"/></christmaslist>'
XQuery – Declaring our XML string
SELECT @x.exist('/christmaslist/person[@gift="socks"]')
SELECT @x.exist('/christmaslist/person[@gift="lump of coal"]')
SELECT @x.exist('/christmaslist/person[@gift="Socks"]‘)
SELECT @x.value('/christmaslist[1]/person[1]/@name', 'VARCHAR(20)‘)
SELECT @x.query('/christmaslist/person')
XQuery - Querying
query()
value()
exist()
nodes()
modify()
XQuery - Querying
http://msdn.microsoft.com/en-us/library/ms345117.aspx
XQuery - Resources
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
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!
ADO.NET
Randomize Select output
Repeat statements with GO x
TSQL Tricks
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
Resources 1/2
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
T-SQL Enhancements
Download from Course Materials Site (to copy/paste scripts) or type manually
http://sharepoint.ssw.com.au/training/UTSSQL/
Session 2 Lab
Free chats and webcasts
List of newsgroups
Microsoft community sites
Community events and columns
Where Else Can I Get Help?
www.microsoft.com/technet/community
Where else can I get help?
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