Av rating:
Total votes: 29
Total comments: 13


Ron Dameron
Comparing Python and PowerShell DBA Scripting
03 August 2007

I became interested in scripting about a year or two ago when I landed a DBA job in a larger shop that was primarily focused on production support and Database Change Management. I was assigned several projects, each of which had at least three servers, Dev, QA, and Prod.

It quickly became apparent to me that keeping up with all the typical daily DBA tasks would require some automation. I had compiled an extensive set of SQL scripts to help with my daily tasks and I had dabbled with VBScript but it didn't quite get my juices flowing. So, I continued searching, trying Perl and then Python, which I had tinkered with at home on a Linux box.

I ended up deciding on Python, mostly because of its clean syntax which makes it really easy to read. An article entitled "Python for Oracle Geeks" was also an influence. All DBAs are busy, so I was looking for a language that I could be productive with in a minimum amount of time. I am by no means an expert at Python or PowerShell. I am a full-time DBA, remember?

So, I've gotten to the point where I've automated several mundane DBA tasks and was pretty happy with my progress, when along comes PowerShell from Microsoft. I had heard about Monad but didn't really pay it much attention because I was pretty satisfied with Python. Then, I sat for Gert Draper's presentation on PowerShell at the Spring 2007 SQL Connections Conference in Orlando, Florida. I was very impressed so I bought Bruce Payette's PowerShell book and dove in.

My thoughts could be summarised as follows

Why scripting?

  • Automate repetitive tasks
  • Query multiple servers for information in one script, run at the command line and returning the results in a single pass as text, HTML, or XLS.

Why Python?

  • Easy to read.
  • No comic cursing, parentheses, or braces.
  • Easy to learn
  • Plenty of documentation on the Internet to help a newbie
  • Available across multiple operating systems.
  • A general purpose programming language used by the likes of Amazon.com, Google, and Industrial Light and Magic.

 

Why PowerShell?

  • Finally, a shell scripting environment for Microsoft Windows.
  • Easier to get to the MS internals?
  • Less code to complete the same task? Maybe.
  • Learn about .Net, WMI, and the Windows Internals as you learn PowerShell
  • Future integration into SQL Server.

So, I've started translating my scripts to PowerShell in an effort to learn it and see how it compares to Python

The Examples

All of the examples to follow are simple ones that a full-time DBA has hacked together to try and ease the burden of the daily DBA chores.

Nothing earth shattering here, but I hope that you will find them useful. They are

  1. Listing installed hot fixes, i.e. DST patch
  2. Checking free space on drives.
  3. Finding a database across multiple servers
  4. Checking the version of SQL Server installed

I'll show the Python code first then the equivalent PowerShell for each task along with appropriate comments. I'll also demonstrate how to output the results as HTML, text, or Excel spreadsheet.

This past Spring, we had to make sure that the DST patch was installed on all of our database servers. We have approximately 300 of them.

For most of them, we could determine from the following script that the patch was installed. There were some special cases but this script saved a lot of time.

The basic idea for all the examples is to loop through a list of servers contained in a text file, connect to each server, run the query, and write the results out in the desired format.

The Python scripts demonstrated will work with either ActivePython 2.4 or 2.5 from ActiveState.com. It’s likely these scripts will work with IronPython also but I have yet to verify it.

Listing installed hot fixes, i.e. DST patch

Python:


import string,sys,win32com.client
from win32com.client import DispatchBaseClass
ListOfServers
='c:\\MyDir\\AFewServers.txt'
txtfile open('C:\\MyDir\\DSTPatched.txt','w')
for line in open(ListOfServers,'r').readlines():
 
servers string.split(string.strip(line),'\n')
 
svr=servers[0]
 
print svr
 objWMIService 
win32com.client.Dispatch("WbemScripting.SWbemLocator")
 
objSWbemServices objWMIService.ConnectServer(svr,"root\cimv2")
 
colItems objSWbemServices.ExecQuery("Select * from
Win32_QuickFixEngineering Where ServicePackInEffect = 'KB928388'"
)
 
for objItem  in colItems:
  txtfile.write 
('CS Name: ' str(objItem.CSName) + '\n')
  
txtfile.write ('Service Pack In Effect: ' +
str(objItem.ServicePackInEffect) + '\n')
  
txtfile.write ('\n')
txtfile.close

The results written to a text file are...

CS Name: AT-RISCSQL143
Service Pack In Effect: KB928388

CS Name: AT-RISCDCC15N01
Service Pack In Effect: KB928388

(Our patches are pushed by Marimba which doesn't typically set a lot of these values in our environment.)

PowerShell:

foreach ($svr in get-content "C:\ MyDir\AFewServers.txt")
      { $svr; get-wmiobject Win32_QuickFixEngineering | findstr KB928388 }

produces...

AT-RISCSQL143
ServicePackInEffect : KB928388
Description : Hotfix for Windows XP (KB928388)

Obviously, the most compelling concept here is that it took significantly fewer lines to produce the desired result. In defense of Python, the code that is needed to access the server, read input, and write output requires minimal changes once you've written your first Python script. You can quickly modify this initial Python template script to accomplish other tasks.

Checking free space on drives

Using Python, I just simply run master..xp_fixeddrives against a list of servers and format the output.

Python:


# CheckDiskSpace.py

# A script to check disk space on all database servers.  

import getpass,string,sys,win32com.client
from win32com.client import DispatchBaseClass

#ListOfServers='c:\\MyDir\\AFewServers.txt'
ListOfServers='c:\\MyDir\\AllServers.txt'

uid 'rdameron'

# take your pick: HTML or Excel
#htmfile = open('c:\\MyDir\\SQLChkSpaceLog.htm','w')
htmfile open('c:\\MyDir\\SQLChkSpaceLog.xls','w')

htmfile.write('<TITLE>SQL Server Space Report</TITLE>\n')

for line in open(ListOfServers,'r').readlines():
  
if line[0]<>'#':
     
servers string.split(string.strip(line),'\n')
     
svr=servers [0]
     
print svr
     htmfile.write
('<TABLE WIDTH=100% CELLPADDING=2 BORDER=2>\n')
     
htmfile.write('<TR>\n')
     
htmfile.write('<TD BGCOLOR=aqua ALIGN=CENTER VALIGN=top WIDTH=20%><B><FONT FACE="ARIAL" SIZE=2>' svr '</FONT></B></TD>\n')
     
htmfile.write('<TD BGCOLOR=aqua ALIGN=CENTER VALIGN=top WIDTH=80%><B><FONT FACE="ARIAL" SIZE=2>Free Space Report</FONT></B></TD>\n')
     
htmfile.write('</TR>\n')
     
htmfile.write('<TD BGCOLOR=aqua ALIGN=LEFT VALIGN=top WIDTH=10%><B><FONT FACE="ARIAL" SIZE=2>Drive</FONT></B></TD>\n')
     
htmfile.write('<TD BGCOLOR=aqua ALIGN=LEFT VALIGN=top WIDTH=20%><B><FONT FACE="ARIAL" SIZE=2>MB Free</FONT></B></TD>\n')            
     
htmfile.write('</TR>\n')

     
adoConn win32com.client.Dispatch('ADODB.Connection')

     
connect  "Provider=SQLOLEDB.1;Data Source=%s;Initial Catalog=master;Integrated Security=SSPI;" % (svr)

     
sql '

        SET NOCOUNT ON

EXEC master.dbo.xp_fixeddrives

'

     
adoConn.Open(connect)
     
     
query adoConn.Execute(sql)

     
while not query[0].EOF:
        drive
=query[0].Fields(0).Value
        free
=query[0].Fields(1).Value
        htmfile.write
('<TR>\n')
        
htmfile.write('<TD VALIGN=top><FONT FACE="COURIER" SIZE=2>%s</FONT></TD>\n' % (drive))
        
htmfile.write('<TD VALIGN=top><FONT FACE="COURIER" SIZE=2>%s</FONT></TD>\n' % (free))
        
htmfile.write('</TR>\n')
        
query [0].MoveNext()
     
     
htmfile.write('</TABLE>\n')

htmfile.close()
adoConn None

Now, here are two ways to check free space with PowerShell...

Powershell

#1 Output as HTML

foreach ($svr in get-content "C:\MyDir\AFewServers.txt") { $svr; Get-WmiObject -Class Win32_LogicalDisk -Filter "DriveType=3" -ComputerName $svr | ConvertTo-Html -property DeviceID,FreeSpace,Size -title "Free Space" -body $svr >> c:\FreeSpace.html}

#2 Output as table

foreach ($svr in get-content "C:\MyDir\AFewServers.txt"){
    $dt
= new-object "System.Data.DataTable"
   
$cn = new-object System.Data.SqlClient.SqlConnection 
>
                 "server=$svr;database=master;Integrated Security=sspi" 
    $cn.Open()
    $sql
= $cn.CreateCommand()

    $svr
    $sql.CommandText = "EXEC master.dbo.xp_fixeddrives"
   
$rdr = $sql.ExecuteReader()
    $dt
.Load($rdr)
    $cn
.Close()
    $dt
| Format-Table -autosize
}

Finding a database across multiple servers 

Python


# A script to find all occurrences of a database on multiple servers.
# Also, demonstrates passing arguments from the command line and error handling
# Writes output to a text file.

# Usage: finddb.py DatabaseName

import string,sys,win32com.client
from win32com.client import DispatchBaseClass


# Python automatically stores the command-line arguments as a list of strings in the argv variable of the sys module.
# If you want to see the list of command-line arguments, remove the # in column 1 to uncomment the line - print sys.argv.
# sys.argv[0] always contains the name of the script.
#print sys.argv  

# Accept command-line argument for name of database to search for.
dbname sys.argv[1]

#ListOfServers='c:\\MyDir\\AllServers.txt'
ListOfServers='c:\\ MyDir\\AFewServers.txt'

txtfile open('C:\\MyDir\\FindDB.txt','w')
txtfile.write('Looking for database:  'dbname '\n')
txtfile.write('\n')

for line in  open(ListOfServers,'r').readlines():
  
if line[0]<>'#':
     
servers string.split(string.strip(line),',')
     
svr=servers[0]
     
print svr
     sql 
None
     txtfile.write
(svr ': \n')
     
adoConn win32com.client.Dispatch('ADODB.Connection')
     
connect "Provider=SQLOLEDB.1;Data Source=%s;Initial Catalog=UMRdb;Integrated Security=SSPI;" % (svr)
     
sql "SELECT name FROM master..sysdatabases WHERE name = '" dbname "'"
     
     
try:   # Python uses 'try – except' to do error handling
        
adoConn.Open( connect)
     
except: 
        txtfile.write
('\t' "Oops, I wasn't able to connect to " svr 
                      + ".  Make sure the server name is correct. \n")
        
continue
        
     
qry adoConn.Execute(sql)
     
     
if qry[0].EOF:  #database was not found 
        
txtfile.write('\t' 'Not here!' '\n')
        
     
while not qry[0].EOF:  #database was found
        
db=qry[0].Fields(0).Value
        txtfile.write
('\t' 'Found it! ')
        
txtfile.write('\t' db '\n')
        
qry[0].MoveNext()
        
txtfile.close()
adoConn None

PowerShell:

foreach ($svr in get-content "C:\MyDir\AFewServers.txt"){
    $dt = new-object "System.Data.DataTable"
   
$cn = new-object System.Data.SqlClient.SqlConnection    "server=$svr;database=master;Integrated Security=sspi"
   
$cn.Open()
    $sql = $cn.CreateCommand()
    #$svr
   
$sql.CommandText = "SELECT @@SERVERNAME AS Server_Name, name FROM master..sysdatabases WHERE name = 'DatabaseYourLookingFor'"
   
$rdr = $sql.ExecuteReader()
    $dt.Load($rdr)
    $cn.Close()
    $dt | Format-Table
}

Checking the version of SQL Server installed

Python


#
# A script to check the SQL Server version and service pack on multiple servers
# Writes output to a text file.
#
import string,sys,win32com.client
from win32com.client import DispatchBaseClass

ListOfServers
='c:\\MyDir\\AllServers.txt'
uid 'rdameron'
txtfile open('c:\\MyDir\\SQLVersions.txt','w')

for line in open(ListOfServers,'r').readlines():
  
if line[0]<>'#':
     
servers string.split(string.strip(line),'\n')
     
svr=servers[0]
     
print svr
     sql 
None
     txtfile.write
('\n')
     
txtfile.write( svr ':  \n')
     
adoConn win32com.client.Dispatch('ADODB.Connection')
     
connect "Provider=SQLOLEDB.1;Data Source=%s;Initial Catalog=UMRdb;Integrated Security=SSPI;" % (svr)
     
sql "SELECT SERVERPROPERTY('ProductVersion') AS Version, SERVERPROPERTY('ProductLevel') as SP"
     
#print sql
     
adoConn.Open(connect)
     
alog adoConn.Execute(sql)
     
while not alog[0].EOF:
        version
=alog[0].Fields(0).Value
        sp
=alog[0].Fields(1).Value
        txtfile.write
('Version: ' +  version '\n')
        
txtfile.write('ServicePack: ' sp ' \n')
        
alog[0].MoveNext()
txtfile.close()
adoConn None

PowerShell:

 foreach ($svr in get-content "C:\MyDir\AFewServers.txt"){
    $dt
= new-object "System.Data.DataTable"
    $cn
= new-object System.Data.SqlClient.SqlConnection "server=$svr;database=master;Integrated Security=sspi"
    $cn
.Open()
    $sql
= $cn.CreateCommand()
    $sql
.CommandText = "SELECT @@SERVERNAME AS ServerName, SERVERPROPERTY('ProductVersion') AS Version, SERVERPROPERTY('ProductLevel') as SP"
    $rdr
= $sql.ExecuteReader()
    $dt
.Load($rdr)
    $cn
.Close()
    $dt
| Format-Table -autosize
}

Conclusions:

I'm pretty excited about what PowerShell offers. I'm beginning to think it's easier to get things done with it and it looks like you can get more done with fewer lines of code using PowerShell. I found Python a bit easier to read initially but I'm getting used to the PowerShell syntax with the help of Bruce Payette's PowerShell book and several PowerShell blogs and forum posts. Plenty of support has built up around PowerShell that helped me to write this article both from Microsoft and PowerShell users. One thing I won't forget is Gert Drapers saying during his conference presentation that prior to PowerShell he used Perl for his admin scripts. It obvious from Bruce Payette's book that Microsoft did take a significant amount of inspiration from languages like Python and Perl to build PowerShell. No matter which scripting language you choose, I think to be really effective in a large environment you must learn to script. I'm hooked on PowerShell because of what it can do to make my life simpler in our Microsoft environment but also the exposure to .Net and WMI that it provides for a DBA

Additional Reading:

“Windows PowerShell in Action” by Bruce Payette

“Dive Into Python” by Mark Pilgrim

code prettified by the Simple-Talk Prettifier



This article has been viewed 7185 times.
Ron Dameron

Author profile: Ron Dameron

Ronald Dameron is a Senior Database Administrator for the largest life insurer in the United States. With almost 20 years of IT experience he has worked on a wide range of environments to include: mainframes, Oracle on Amdahl's Unix variant UTS, Sybase on AIX and Microsoft SQL Server since version 7. He is most comfortable with Microsoft SQL Server as a database developer and DBA. He is currently exploring how PowerShell can simplify his life as a DBA and the new features of SQL Server 2005. In his spare time, he enjoys rescucitating old PC hardware with Ubuntu Linux. To stay sane during his busy days at work, he practices the Yang style of Tai Chi or Power Yoga every morning. He feeds the hungry masses at his house with his Weber Kettle grill or the recipes of Rachel Ray.

Search for other articles by Ron Dameron

Rate this article:   Avg rating: from a total of 29 votes.


Poor

OK

Good

Great

Must read
 
Have Your Say
Do you have an opinion on this article? Then add your comment below:
You must be logged in to post to this forum

Click here to log in.


Subject: Python and PowerShell
Posted by: Joe Landau (not signed in)
Posted on: Wednesday, August 08, 2007 at 11:30 AM
Message: That is a great article. Many thanks. A question: I would have counted a point in Python's favor that one's knowledge of Python could be used outside the Microsoft world--for instance, on the net (as opposed to the dotnet). Is this so, or is Powershell well supported in general, too?

Subject: Re: Python and Powershell
Posted by: Ken3 (view profile)
Posted on: Thursday, August 09, 2007 at 1:22 PM
Message: Yes, Python really is an industry standard. Powershell is purely a Microsoft thing. IronPython will do anything that Powershell does and the documentation is far better. I would unhesitatingly recommend IronPython as a DBA tool. It is intuitive and there is a great deal of support and plenty of active communities on the Internet. It is a great way of using SMO too and generally programming in .NET. The only thing it wont do is CLR, but then, neither will Powershell

Subject: Re: Python and Powershell
Posted by: Chuck Esterbrook (not signed in)
Posted on: Friday, August 10, 2007 at 4:56 AM
Message: I was really surprised at how unbalanced the first comparison was! If you make the Python output match the Powershell, the Python source gets much smaller. If you make the Powershell output match the Python, it will get much larger. I didn't study the other examples to see if they were also unbalanced. (Okay I glanced at one and the Powershell seemed to skip error detection and recovery, but maybe it does that automatically.)

Also, with some work, a Python function to output HTML tables could be made and reused. But yes, it's nice if Powershell does that out of the box.

In fact, I'm in favor of building a "utils.py" at a local site and doing "from utils import *" to get quick access to imports and reusable functions with minimal fuss. I also realize DBAs might not be adept at creating reusable code (because they're busy being adept at other things).

I don't understand your comment "The only thing it wont do is CLR". IronPython can do "import clr" and access the CLR.

I'm not down on Powershell, btw. It looks like a nice tool with easy access to Microsoft infrastructure. The data-oriented results (as opposed to text-oriented like in posix) is a nice aspect, too.

Thanks for the article.

Subject: IronPython and CLR integration
Posted by: Ken3 (view profile)
Posted on: Friday, August 10, 2007 at 7:49 AM
Message: Sorry, Chuck, I was meaning SQL Server CLR integration; I'm talking as a DBA. You're right, IronPython can access all the CLR routines, but it was the CLR integration bit with SQL Server that would be nice. At the moment we are stuck with having to get out the C# or VB for doing all that stuff. Like most DBAs, I just want one one scripting language to do everything. IronPython is the nearest I've seen- for me it looks ding near perfect. Please someone find a way of doing CLR integration for SQL Server with it.

Subject: Re: Python and PowerShell
Posted by: Ron Dameron (not signed in)
Posted on: Saturday, August 11, 2007 at 6:43 AM
Message: Thanks for the comments and kudos.

I do agree that one's Python experience could be useful on multiple platforms.

IronPython did come up during the tech review for this article. I have approximately 40 Python scripts so I am definitely going to validate them against IronPython. My first experience with scripting was on an Oracle server so IronPython didn't fit at the time and it was still relatively new. That first script was running on a scheduler so I wanted to go with the mainstream Python implementation.

Most of my Python scripts for the MS environment are meant to be run by the DBA to answer an immediate question. They were put together pretty quickly and weren't initially meant to run unattended. Thus, the Python examples have a minimum of error checking in them. The PowerShell examples have no error checking as Chuck noted because they are for the most part very brief, I run them interactively, and I'm still learning the language.

Based on Chuck's comment, I have revised the first example to improve the "balance" between the examples and have asked Simple Talk if I can update the example.

Thanks for taking the time to comment.



Subject: There's a WMI module for Python
Posted by: Jan Persson (not signed in)
Posted on: Monday, August 20, 2007 at 6:22 AM
Message: Why don't you use the WMI module for Python? If you neglect to do so you really end up comparing apples and oranges and PowerShell will always come out on top for these kinds of tasks.

http://tgolden.sc.sabren.com/python/wmi.html

There's also a cookbook with common tasks like this:

<pre>
# Show the percentage free space for each fixed disk
import wmi
c = wmi.WMI ()
for disk in c.Win32_LogicalDisk (DriveType=3):
print disk.Caption, "%0.2f%% free" % (100.0 * long (disk.FreeSpace) / long (disk.Size))
</pre>

Subject: Re: There's a WMI module for Python
Posted by: Ron Dameron (not signed in)
Posted on: Tuesday, August 21, 2007 at 3:52 PM
Message: Jan,

Thanks for the tip. I will check it out.

Subject: enjoyed seeing the other approaches - note on Perl
Posted by: R Reid (not signed in)
Posted on: Tuesday, August 28, 2007 at 12:44 PM
Message: I enjoyed the article. Tools are personal and situational; when I went to try the Python examples I realized we do not have win32com modules on our Solaris systems!

I've stuck with Perl as my scripting language - #1 because I know it - but #2 because I can use the DBD modules, compiled with FreeTDS, to access SQL Server (and Sybase) from Solaris.

These are the kinds of things that let me port work done in the early 80's to SQL Server, without a major rewrite.

Which doesn't mean someone can't find a way to use Python to access SQL Server from Solaris - our situations and personal preferences are different. I was (and am) very excited about PowerShell - but OY the syntax - worse than Unix's "find" command!

Subject: Building things from first principle ain't the best way to use python
Posted by: Andres Celerio (not signed in)
Posted on: Thursday, February 07, 2008 at 8:28 AM
Message: The strength of python is in it's ability to
allow us to write code that is as clear as we want it to be.

This is made possible by the language's ability to create module, class, functions etc.

import datasource

cursor = datasource.cursor( 'AnOracle' )
rows = cursor.Select( 'SELECT * FROM atable' )
for row in rows:

Subject: Building things from first principlecain't the best way to use python
Posted by: Andres Celerio (not signed in)
Posted on: Thursday, February 07, 2008 at 9:27 AM
Message: The strength of python is in it's ability to
allow us to write code that is as clear and clean as desire.

This is made possible by the language's ability to create module, class, functions etc with ease.

Would be interested to see example in this aspect which we find to be of most importance.


We've been using Python with our datawarehouse implementation which involves reading excels,
write web user interface, access databases, text files, gather system information, process logfiles, sending mail, sms. We use it in Windows and Unix.

Most written code are executed many many times. Ability to write clear reusable module is essential to productivity.

The following are example code that we use to access our database table:-

import datasource

cursor = datasource.cursor( 'Some Connection Key' )
cursor.execute( 'SELECT NAME, ADDRESS FROM CONTACT' )

for row in cursor:
print row.NAME, row.ADDRESS

While we've put in a lot of effort to write the module datasource which can be used to access Sybase or Oracle or SQL Server depend on the key supplied. Once written, the effort to access database become effortless even to remember.

Note also the ability to refer the column name in the code as if they are attribute of the row.

These are made possible by python's ability to allow the emulation of attribute access.

Subject: Great examples!
Posted by: Anonymous (not signed in)
Posted on: Thursday, April 24, 2008 at 11:43 AM
Message: Dear Ron,

I was looking fow a way to work with Python in SQL 2005 and had found some way to connect through DSN. However, using that connection didn't allow me to use the rich features of win32com.client.Dispatch('ADODB.Connection').

So what I did is I used the adoConn and with that I was able to query a table in a SQL2005 server.

Here is what worked in Python 2.5 connected to SQL 2005:

adoConn = win32com.client.Dispatch('ADODB.Connection')
connect = "Provider=SQLOLEDB.1;Data Source=ENVAEENG;Initial Catalog=ReportServer;Integrated Security=SSPI;"
sql = "select * from table"

adoConn.Open(connect)
alog = adoConn.Execute(sql)
# printing the equivalent of select field0 from #table where row=1
version=alog[0].Fields(0).Value
version2=alog[0].Fields(1).Value
version3=alog[0].Fields(2).Value
# and row=2
alog[0].move(1)
version_1=alog[0].Fields(0).Value
version2_2=alog[0].Fields(1).Value
version3_3=alog[0].Fields(2).Value

print version, ' ', version2, ' ', version3
print version_1, ' ', version2_2, ' ', version3_3


Tx very much!!! I would give this article a FIVE stars!

PS: I found funny your comments about feeding the troup at home, you must have a big family!


Subject: Twining
Posted by: Trilok Khairnar (not signed in)
Posted on: Friday, June 06, 2008 at 3:35 PM
Message: Check out Twining, the IronPython DSL for working with databases.
http://www.t3rse.com/twining/

Subject: Python have html renders.
Posted by: Anonymous (not signed in)
Posted on: Wednesday, July 30, 2008 at 9:17 PM
Message: Don´t forget that python can work with templates, It lets write very nice HTML reports with no headache when one embeed, HTML code into python scripts

 









Phil Factor
Bunnikins!
 When an IT manager is selected as a victim of office politics of a large corporate, it is time for him to engage in... Read more...



 View the blog
Using Powershell to Generate Table-Creation Scripts
 For all of us who learn best by trying out examples, Bob Sheldon produces a PowerShell script file for... Read more...

SQL Toolbelt 2008: Predominantly an Engineering Task
 The conversion of the Red-Gate tools to be compatible with SQL Server 2008 might not seem, on first... Read more...

Audit Crosschecks
 In this short article, the second of a 2-part series, William suggests a solution, using SQL Data... Read more...

XML Jumpstart Workbench
 In which Robyn and Phil decide that the best way of starting to learn XML is to jump in and take a ride... Read more...

Discovering Security Uses for SQL Compare
 Much of the security of SQL Server is implemented as part of the database schema. This provides some... Read more...

Beginning SQL Server 2005 Reporting Services Part 1
 Steve Joubert begins an in-depth tour of SQL Server 2005 Reporting Services with a step-by-step guide... Read more...

Ten Common Database Design Mistakes
 Database design and implementation is the cornerstone of any data centric project (read 99.9% of... Read more...

SQL Server Full Text Search Language Features
 SQL Full-text Search (SQL FTS) is an optional component of SQL Server 7 and later, which allows fast... Read more...

Beginning SQL Server 2005 Reporting Services Part 2
 Continuing his in-depth tour of SQL Server 2005 Reporting Services, Steve Joubert demonstrates the most... Read more...

Executing SSIS Packages
 Nigel Rivett demonstrates how to execute all SSIS packages in a given folder using either an SSIS... Read more...

Over 150,000 Microsoft professionals subscribe to the Simple-Talk technical journal. Join today, it's fast, simple, free and secure.

Join Simple Talk