- SQL Server Reference Guide
- Introduction
- SQL Server Reference Guide Overview
- Table of Contents
- Microsoft SQL Server Defined
- SQL Server Editions
- SQL Server Access
- Informit Articles and Sample Chapters
- Online Resources
- Microsoft SQL Server Features
- SQL Server Books Online
- Clustering Services
- Data Transformation Services (DTS) Overview
- Replication Services
- Database Mirroring
- Natural Language Processing (NLP)
- Analysis Services
- Microsot SQL Server Reporting Services
- XML Overview
- Notification Services for the DBA
- Full-Text Search
- SQL Server 2005 - Service Broker
- Using SQL Server as a Web Service
- SQL Server Encryption Options Overview
- SQL Server 2008 Overview
- SQL Server 2008 R2 Overview
- SQL Azure
- The Utility Control Point and Data Application Component, Part 1
- The Utility Control Point and Data Application Component, Part 2
- Microsoft SQL Server Administration
- The DBA Survival Guide: The 10 Minute SQL Server Overview
- Preparing (or Tuning) a Windows System for SQL Server, Part 1
- Preparing (or Tuning) a Windows System for SQL Server, Part 2
- Installing SQL Server
- Upgrading SQL Server
- SQL Server 2000 Management Tools
- SQL Server 2005 Management Tools
- SQL Server 2008 Management Tools
- SQL Azure Tools
- Automating Tasks with SQL Server Agent
- Run Operating System Commands in SQL Agent using PowerShell
- Automating Tasks Without SQL Server Agent
- Storage – SQL Server I/O
- Service Packs, Hotfixes and Cumulative Upgrades
- Tracking SQL Server Information with Error and Event Logs
- Change Management
- SQL Server Metadata, Part One
- SQL Server Meta-Data, Part Two
- Monitoring - SQL Server 2005 Dynamic Views and Functions
- Monitoring - Performance Monitor
- Unattended Performance Monitoring for SQL Server
- Monitoring - User-Defined Performance Counters
- Monitoring: SQL Server Activity Monitor
- SQL Server Instances
- DBCC Commands
- SQL Server and Mail
- Database Maintenance Checklist
- The Maintenance Wizard: SQL Server 2000 and Earlier
- The Maintenance Wizard: SQL Server 2005 (SP2) and Later
- The Web Assistant Wizard
- Creating Web Pages from SQL Server
- SQL Server Security
- Securing the SQL Server Platform, Part 1
- Securing the SQL Server Platform, Part 2
- SQL Server Security: Users and other Principals
- SQL Server Security – Roles
- SQL Server Security: Objects (Securables)
- Security: Using the Command Line
- SQL Server Security - Encrypting Connections
- SQL Server Security: Encrypting Data
- SQL Server Security Audit
- High Availability - SQL Server Clustering
- SQL Server Configuration, Part 1
- SQL Server Configuration, Part 2
- Database Configuration Options
- 32- vs 64-bit Computing for SQL Server
- SQL Server and Memory
- Performance Tuning: Introduction to Indexes
- Statistical Indexes
- Backup and Recovery
- Backup and Recovery Examples, Part One
- Backup and Recovery Examples, Part Two: Transferring Databases to Another System (Even Without Backups)
- SQL Profiler - Reverse Engineering An Application
- SQL Trace
- SQL Server Alerts
- Files and Filegroups
- Partitioning
- Full-Text Indexes
- Read-Only Data
- SQL Server Locks
- Monitoring Locking and Deadlocking
- Controlling Locks in SQL Server
- SQL Server Policy-Based Management, Part One
- SQL Server Policy-Based Management, Part Two
- SQL Server Policy-Based Management, Part Three
- Microsoft SQL Server Programming
- An Outline for Development
- Database
- Database Services
- Database Objects: Databases
- Database Objects: Tables
- Database Objects: Table Relationships
- Database Objects: Keys
- Database Objects: Constraints
- Database Objects: Data Types
- Database Objects: Views
- Database Objects: Stored Procedures
- Database Objects: Indexes
- Database Objects: User Defined Functions
- Database Objects: Triggers
- Database Design: Requirements, Entities, and Attributes
- Business Process Model Notation (BPMN) and the Data Professional
- Business Questions for Database Design, Part One
- Business Questions for Database Design, Part Two
- Database Design: Finalizing Requirements and Defining Relationships
- Database Design: Creating an Entity Relationship Diagram
- Database Design: The Logical ERD
- Database Design: Adjusting The Model
- Database Design: Normalizing the Model
- Creating The Physical Model
- Database Design: Changing Attributes to Columns
- Database Design: Creating The Physical Database
- Database Design Example: Curriculum Vitae
- NULLs
- The SQL Server Sample Databases
- The SQL Server Sample Databases: pubs
- The SQL Server Sample Databases: NorthWind
- The SQL Server Sample Databases: AdventureWorks
- The SQL Server Sample Databases: Adventureworks Derivatives
- UniversalDB: The Demo and Testing Database, Part 1
- UniversalDB: The Demo and Testing Database, Part 2
- UniversalDB: The Demo and Testing Database, Part 3
- UniversalDB: The Demo and Testing Database, Part 4
- Getting Started with Transact-SQL
- Transact-SQL: Data Definition Language (DDL) Basics
- Transact-SQL: Limiting Results
- Transact-SQL: More Operators
- Transact-SQL: Ordering and Aggregating Data
- Transact-SQL: Subqueries
- Transact-SQL: Joins
- Transact-SQL: Complex Joins - Building a View with Multiple JOINs
- Transact-SQL: Inserts, Updates, and Deletes
- An Introduction to the CLR in SQL Server 2005
- Design Elements Part 1: Programming Flow Overview, Code Format and Commenting your Code
- Design Elements Part 2: Controlling SQL's Scope
- Design Elements Part 3: Error Handling
- Design Elements Part 4: Variables
- Design Elements Part 5: Where Does The Code Live?
- Design Elements Part 6: Math Operators and Functions
- Design Elements Part 7: Statistical Functions
- Design Elements Part 8: Summarization Statistical Algorithms
- Design Elements Part 9:Representing Data with Statistical Algorithms
- Design Elements Part 10: Interpreting the Data—Regression
- Design Elements Part 11: String Manipulation
- Design Elements Part 12: Loops
- Design Elements Part 13: Recursion
- Design Elements Part 14: Arrays
- Design Elements Part 15: Event-Driven Programming Vs. Scheduled Processes
- Design Elements Part 16: Event-Driven Programming
- Design Elements Part 17: Program Flow
- Forming Queries Part 1: Design
- Forming Queries Part 2: Query Basics
- Forming Queries Part 3: Query Optimization
- Forming Queries Part 4: SET Options
- Forming Queries Part 5: Table Optimization Hints
- Using SQL Server Templates
- Transact-SQL Unit Testing
- Index Tuning Wizard
- Unicode and SQL Server
- SQL Server Development Tools
- The SQL Server Transact-SQL Debugger
- The Transact-SQL Debugger, Part 2
- Basic Troubleshooting for Transact-SQL Code
- An Introduction to Spatial Data in SQL Server 2008
- Performance Tuning
- Performance Tuning SQL Server: Tools and Processes
- Performance Tuning SQL Server: Tools Overview
- Creating a Performance Tuning Audit - Defining Components
- Creating a Performance Tuning Audit - Evaluation Part One
- Creating a Performance Tuning Audit - Evaluation Part Two
- Creating a Performance Tuning Audit - Interpretation
- Creating a Performance Tuning Audit - Developing an Action Plan
- Understanding SQL Server Query Plans
- Performance Tuning: Implementing Indexes
- Performance Monitoring Tools: Windows 2008 (and Higher) Server Utilities, Part 1
- Performance Monitoring Tools: Windows 2008 (and Higher) Server Utilities, Part 2
- Performance Monitoring Tools: Windows System Monitor
- Performance Monitoring Tools: Logging with System Monitor
- Performance Monitoring Tools: User Defined Counters
- General Transact-SQL (T-SQL) Performance Tuning, Part 1
- General Transact-SQL (T-SQL) Performance Tuning, Part 2
- General Transact-SQL (T-SQL) Performance Tuning, Part 3
- Performance Monitoring Tools: An Introduction to SQL Profiler
- Performance Tuning: Introduction to Indexes
- Performance Monitoring Tools: SQL Server 2000 Index Tuning Wizard
- Performance Monitoring Tools: SQL Server 2005 Database Tuning Advisor
- Performance Monitoring Tools: SQL Server Management Studio Reports
- Performance Monitoring Tools: SQL Server 2008 Activity Monitor
- The SQL Server 2008 Management Data Warehouse and Data Collector
- Performance Monitoring Tools: Evaluating Wait States with PowerShell and Excel
- Practical Applications
- Choosing the Back End
- The DBA's Toolbox, Part 1
- The DBA's Toolbox, Part 2
- Scripting Solutions for SQL Server
- Building a SQL Server Lab
- Using Graphics Files with SQL Server
- Enterprise Resource Planning
- Customer Relationship Management (CRM)
- Building a Reporting Data Server
- Building a Database Documenter, Part 1
- Building a Database Documenter, Part 2
- Data Management Objects
- Data Management Objects: The Server Object
- Data Management Objects: Server Object Methods
- Data Management Objects: Collections and the Database Object
- Data Management Objects: Database Information
- Data Management Objects: Database Control
- Data Management Objects: Database Maintenance
- Data Management Objects: Logging the Process
- Data Management Objects: Running SQL Statements
- Data Management Objects: Multiple Row Returns
- Data Management Objects: Other Database Objects
- Data Management Objects: Security
- Data Management Objects: Scripting
- Powershell and SQL Server - Overview
- PowerShell and SQL Server - Objects and Providers
- Powershell and SQL Server - A Script Framework
- Powershell and SQL Server - Logging the Process
- Powershell and SQL Server - Reading a Control File
- Powershell and SQL Server - SQL Server Access
- Powershell and SQL Server - Web Pages from a SQL Query
- Powershell and SQL Server - Scrubbing the Event Logs
- SQL Server 2008 PowerShell Provider
- SQL Server I/O: Importing and Exporting Data
- SQL Server I/O: XML in Database Terms
- SQL Server I/O: Creating XML Output
- SQL Server I/O: Reading XML Documents
- SQL Server I/O: Using XML Control Mechanisms
- SQL Server I/O: Creating Hierarchies
- SQL Server I/O: Using HTTP with SQL Server XML
- SQL Server I/O: Using HTTP with SQL Server XML Templates
- SQL Server I/O: Remote Queries
- SQL Server I/O: Working with Text Files
- Using Microsoft SQL Server on Handheld Devices
- Front-Ends 101: Microsoft Access
- Comparing Two SQL Server Databases
- English Query - Part 1
- English Query - Part 2
- English Query - Part 3
- English Query - Part 4
- English Query - Part 5
- RSS Feeds from SQL Server
- Using SQL Server Agent to Monitor Backups
- Reporting Services - Creating a Maintenance Report
- SQL Server Chargeback Strategies, Part 1
- SQL Server Chargeback Strategies, Part 2
- SQL Server Replication Example
- Creating a Master Agent and Alert Server
- The SQL Server Central Management System: Definition
- The SQL Server Central Management System: Base Tables
- The SQL Server Central Management System: Execution of Server Information (Part 1)
- The SQL Server Central Management System: Execution of Server Information (Part 2)
- The SQL Server Central Management System: Collecting Performance Metrics
- The SQL Server Central Management System: Centralizing Agent Jobs, Events and Scripts
- The SQL Server Central Management System: Reporting the Data and Project Summary
- Time Tracking for SQL Server Operations
- Migrating Departmental Data Stores to SQL Server
- Migrating Departmental Data Stores to SQL Server: Model the System
- Migrating Departmental Data Stores to SQL Server: Model the System, Continued
- Migrating Departmental Data Stores to SQL Server: Decide on the Destination
- Migrating Departmental Data Stores to SQL Server: Design the ETL
- Migrating Departmental Data Stores to SQL Server: Design the ETL, Continued
- Migrating Departmental Data Stores to SQL Server: Attach the Front End, Test, and Monitor
- Tracking SQL Server Timed Events, Part 1
- Tracking SQL Server Timed Events, Part 2
- Patterns and Practices for the Data Professional
- Managing Vendor Databases
- Consolidation Options
- Connecting to a SQL Azure Database from Microsoft Access
- SharePoint 2007 and SQL Server, Part One
- SharePoint 2007 and SQL Server, Part Two
- SharePoint 2007 and SQL Server, Part Three
- Querying Multiple Data Sources from a Single Location (Distributed Queries)
- Importing and Exporting Data for SQL Azure
- Working on Distributed Teams
- Professional Development
- Becoming a DBA
- Certification
- DBA Levels
- Becoming a Data Professional
- SQL Server Professional Development Plan, Part 1
- SQL Server Professional Development Plan, Part 2
- SQL Server Professional Development Plan, Part 3
- Evaluating Technical Options
- System Sizing
- Creating a Disaster Recovery Plan
- Anatomy of a Disaster (Response Plan)
- Database Troubleshooting
- Conducting an Effective Code Review
- Developing an Exit Strategy
- Data Retention Strategy
- Keeping Your DBA/Developer Job in Troubled Times
- The SQL Server Runbook
- Creating and Maintaining a SQL Server Configuration History, Part 1
- Creating and Maintaining a SQL Server Configuration History, Part 2
- Creating an Application Profile, Part 1
- Creating an Application Profile, Part 2
- How to Attend a Technical Conference
- Tips for Maximizing Your IT Budget This Year
- The Importance of Blue-Sky Planning
- Application Architecture Assessments
- Transact-SQL Code Reviews, Part One
- Transact-SQL Code Reviews, Part Two
- Cloud Computing (Distributed Computing) Paradigms
- NoSQL for the SQL Server Professional, Part One
- NoSQL for the SQL Server Professional, Part Two
- Object-Role Modeling (ORM) for the Database Professional
- Business Intelligence
- BI Explained
- Developing a Data Dictionary
- BI Security
- Gathering BI Requirements
- Source System Extracts and Transforms
- ETL Mechanisms
- Business Intelligence Landscapes
- Business Intelligence Layouts and the Build or Buy Decision
- A Single Version of the Truth
- The Operational Data Store (ODS)
- Data Marts – Combining and Transforming Data
- Designing Data Elements
- The Enterprise Data Warehouse — Aggregations and the Star Schema
- On-Line Analytical Processing (OLAP)
- Data Mining
- Key Performance Indicators
- BI Presentation - Client Tools
- BI Presentation - Portals
- Implementing ETL - Introduction to SQL Server 2005 Integration Services
- Building a Business Intelligence Solution, Part 1
- Building a Business Intelligence Solution, Part 2
- Building a Business Intelligence Solution, Part 3
- Tips and Troubleshooting
- SQL Server and Microsoft Excel Integration
- Tips for the SQL Server Tools: SQL Server 2000
- Tips for the SQL Server Tools – SQL Server 2005
- Transaction Log Troubles
- SQL Server Connection Problems
- Orphaned Database Users
- Additional Resources
- Tools and Downloads
- Utilities (Free)
- Tool Review (Free): DBDesignerFork
- Aqua Data Studio
- Microsoft SQL Server Best Practices Analyzer
- Utilities (Cost)
- Quest Software's TOAD for SQL Server
- Quest Software's Spotlight on SQL Server
- SQL Server on Microsoft's Virtual PC
- Red Gate SQL Bundle
- Microsoft's Visio for Database Folks
- Quest Capacity Manager
- SQL Server Help
- Visual Studio Team Edition for Database Professionals
- Microsoft Assessment and Planning Solution Accelerator
- Aggregating Server Data from the MAPS Tool
I'm continuing a series on scripting for real-world applications; this time using Microsoft's newest scripting language, PowerShell. If you haven't read the previous entries, you might want to take a look at those before you continue here — I've introduced some concepts that we're now ready to build on.
I've also done an overview of scripting in general, in which I describe the difference between a scripting language and a full programming exercise. Scripting is often command-based, and deals less with formal programming concepts like objects, inheritance, and other advanced terms. In both scripting and programming you're just writing instructions that a computer will carry out. In programming languages the commands you use are more abstracted — they do things like branching off to other parts of the code and including things written in other parts of the program.
Most DBAs know how to write code. You've possibly been to a Computer Science class or two, learned on your own through courses, or just figured it out on the job. Because those last two aren't as consistent as other methods, you might not have learned everything that you need to be a good programmer. But that's normally OK, since batch files or other scripting methods don't have the range of concepts that formal programming languages do. Not only that, you might not code for a living.
There are exceptions, of course. If you've used vbscript, cscript, Perl, or other "scripting" languages you've at least had things like functions available to you. Perhaps your DBA tasks include writing stored procedures, functions or other coding tasks. In that case you may already be familiar with various programming concepts. I've covered some of these concepts in the Programming section of the SQL Server Guide on InformIT. Many of these concepts exist in PowerShell. Up to now, we've been using PowerShell by simply running commands one at a time, and then by stacking those commands in a text file and allowing that to run one line at a time.
But now it's time to put all those concepts to work, and to do that properly we'll have to dive in to programming — a little. Those of you who are comfortable with programming concepts will likely look at this article and think, "what's the big deal?," but for those Database Administrators who have to know everything from Windows to SAN hardware, networking concepts and security, the last thing they want to do is add another thing to learn to the list. It isn't just learning some new technology; it's keeping up with that knowledge when it changes and evolves. DBAs don't often have time or interest in maintaining knowledge they can only use in one place.
Don't worry — what I'm about to show you isn't "wasted" knowledge. What you'll learn here is universal to many programming and scripting languages, and very powerful. In fact, I'm only going to introduce one additional concept to the simple ones you've already learned. And for those of you who are experienced with programming concepts, this is something you already know. And if you've been a DBA for very long, you also already have this concept down.
What I'm talking about is the idea of functions. Functions are simply names in the file somewhere that bundle up some task you want to repeat a number of times. When you need it, you "call" the function by including that name in a line of code. PowerShell interprets this name as a jump, and branches down to the code you've written in the function. When the function is done, the code continues where it left off. Functions can also accept inputs from another part of the code, work on those inputs, and return results or just perform a task using them.
This is a very powerful tool, since it lets you write the code in one place, but use it multiple times. While that isn't very difficult to understand, the real power is in passing information in to the function, and receiving data back out.
We'll need this right away because we want to do two things in our larger script over and over. In fact, you'll often want to do these same steps over and over in every script you write. The first thing we want to do is log events, and the second is to deal with any errors that our script generates. We'll set up our script "framework" to have those two functions built right in, and we can call both of them at any step along the way. We'll build a framework that we can use with any PowerShell script, and we'll fill this one with some meaningful code for this series. You can use this framework with a few changes here and there over and over.
In this series we'll make a script that performs a database backup to a file, compresses the file and includes the date in the name, copies the file, and then restore the file to the same or another server. We'll drive the databases, servers, locations and other variables from an XML file to make it useful, and log the entire process. We'll also perform simple error checking along the way.
I've had to do this kind of thing in the past, and because I needed to easily transport the task to another environment, scripting was the best solution. I've used this for reporting databases, development environments, just about anywhere that I needed a copy of one database in total to another. Even if this isn't a scenario you're interested in using, the concepts hold for just about any task you need to perform in Windows or SQL Server.
So let's get started. As I mentioned in my series on programming, the first thing I do when I'm writing any code is to outline the steps I want to take using comments. That's easy enough, and we'll use single comments along the way, which is the "pound" or "hash" sign: #. I always include the name of the script, the purpose, the author, and the last changed date in the file, along with any special instructions needed to make it work. We'll being with a simple script that forms the basics. If you're following along at home, open a text editor and insert the following text:
# TransferDatabase.PS1 # Backup, Compresses, Copy and Restores a Database from # one Server to Another. # Buck Woody # Last changed: 07/02/2007 # Requires an XML file called "TransferDatabases.XML" #in the current directory # Logging Process Function # Error Handing Function # Do some work
Now let's take care of the second section, the error handling. We'll actually find errors within the "# Do the work" section, but the results of that error will be handed off to a function to deal with them.
By the way, in formal programming, this isn't always the way you'll handle errors. Most of the time you'll get a very specific error returned to you, and you'll handle each in a different way. For instance, perhaps the backup won't complete because you're out of room on the hard drive where you send it. In that case you might want to try an alternate location, or potentially send you an e-mail or call your pager to take care of the situation. That requires different error-handling steps than when the compression step fails.
In this case, we're only doing the bare minimum, sending the error messages to the log so that we can deal with them later. As I mentioned, this might not the best way to deal with the error, but you should at least have this much handling built right in.
So let's get coding. We'll catch any error in the code and call the function. The first construct is quite simple. You start the work with the word "trap." This means exactly what it says — "Try this, and see if it works. If it doesn't, trap what happened." To make that work, the word trap is followed by a set of curly-braces, as in this example:
Trap { # Do something if an error occurs. }
To deal with errors, you have to have some. In fact, you probably already do – you can see them by asking about the error object in PowerShell, which is called $error. Try typing that at the PowerShell prompt and a screen or two of data will probably scroll by. This variable stores the outputs of the Error object in PowerShell. While we won't manipulate that object directly, we'll query its properties to learn more about what just happened, so we can fix the issue.
As I mentioned, you'll most often deal with the problem in particular, but in this case we'll just record the error and stop the program.
So what can we ask the error object? Actually, quite a bit, but these are the ones we'll include:
- CategoryInfo: This is the category of error that occurred.
- TargetObject: This is the object that was in play when the error happened.
- Exception: This is the description of the error that just occurred. It also has properties that we'll query.
- FullyQualifiedErrorId: This is the specific error. Useful when you need to look the problem up on the web.
Since we don't want all errors documented repeatedly, we'll deal with only the last one. We can find that using the array value (the first item in the group of errors, which starts with 0) of the most recent error. Try it on your system now:
$error[0]
That brings back the most recent error text. But let's ask the error a little more about itself:
$error[0].Exception.Message
Now we're getting somewhere. We have everything we need to get started on our error function. Let's take a look at our script now, with a demo of an error. Today we'll just write the error to the screen and bail out of the program; we'll learn next time how to log the error information:
# TransferDatabase.PS1 # Backup, Compresses, Copy and Restores a Database from one Server to Another. # Buck Woody # Last changed: 07/02/2007 # Requires an XML file called "TransferDatabases.XML" #in the current directory # Logging Process Function # Error Handing Function # In this case we're just writing the error info out # to the screen. Later we'll log it so we can get the # error information even though no one is at the console. function ErrorHandler { write-host "Error Category:" $error[0].CategoryInfo.Category write-host "Object being worked on:" $error[0].TargetObject write-host "Error Message:" $error[0].Exception.Message write-host "Error Message:" $error[0].FullyQualifiedErrorId } # Do some work Trap { # Go to the error handler ErrorHandler # Stop the program. break; } # We need to cause an error. Let's make up a fake command: RockMeAmadeus!
There's a lot more to do, but we have the beginning of our transfer script. In the next installment we'll create the logging function, so we'll know if any errors are encountered with our process along the way.
InformIT Articles and Sample Chapters
I've only scratched the surface of error handling here. You can read more about it in this free chapter on Java here at InformIT. Although it's for another language, the concepts hold.
Online Resources
There's a free chapter you can read that describes error handling in far more detail here.