Author: way0utwest

  • Go Small

    The SQL Server community is a surprisingly close knit one. I find that people are much more willing to help each other and share knowledge. We have so many events and user groups, it’s amazing to me that on almost every weekend of the year, some event is taking place, somewhere in the world. I’ve been to dozens of SQL Saturdays, and most of them are run very well, but I’ve also seen lots of extravagance in putting on the events. There’s competition between the events and organizers, which is mostly healthy, but I do worry about the long term health of our community.

    Most events depend on some sort of sponsorship to get going. Venues can cost a good bit of money, and while many events now charge for lunch, the breakfast, coffee, sodas, etc. are the burden of the organizers. Add in signs, printed guides, gas, etc., and events can get expensive. Many events get shirts for volunteers and speakers (or a small gift), as well and a Friday night dinner to thank everyone for their help. These expenses have become commonplace.

    However as we continue to add new events, I can tell you that the overall cost to vendors is significant. I can’t speak for other vendors, but I know Red Gate wants to support these events, and we plan to continue providing sponsorship, as well as sending Grant and myself to speak. However we also have to make choices about which events to support and how many we can participate in. That means that as more events are run, fewer will get funding. Many existing events might see less funding from all vendors.

    I really like the idea of bare bones events. Jen McCown proposed a format and I like it. As we look to grow more events in the future, we need to be lean, efficient, and most importantly, focus on the goal: teaching. Big events are fine, and if you can make them happen, great. However let’s not let the lack of a big budget get in the way of helping teach people about SQL Server, growing our skills and bond as a community.

    Steve Jones

    The Voice of the DBA Podcast

    Listen to the MP3 Audio ( 2.5MB) podcast or subscribe to the feed at iTunes and LibSyn.

  • RegEx Those Dates

    This is a series on SQL Data Generator, covering some interesting scenarios I’ve run into. If you’ve never tried it, SQL Data Generator is a part of the SQL Toolbelt. Give it a try today with an evaluation today.

    Recently I was working on transforming some dates, and wanted to generate a large n number of dates for testing. I decided to use SQL Data Generator, and a little RegEx to meet my needs.

    The format I needed was CYYMMDD, which is the century as a 0 or 1 (1900 or 2000) and then the yymmdd format. While there are some pre-made expressions to build dates, there wasn’t an easy one to handle the century like this. I could have used a date expression in T-SQL and randomly allocated a century, but I decided to play around with RegEx.

    I know that the brackets allow a choice of values to be used. The regular expression can choose any of the values to match. An example is for the first part of my date, the century. It can be zero or one, so I can do this:

    [01]

    When Data Generator runs, it will randomly build expressions that match this pattern, which in my case results in

    regex01

    That makes it easy for me to pick numbers, and I could do something like this for the years:

    [01][0-0][0-9]

    That works, as any number from 00, as in 2000, up to 99, as in 1999, is valid. That gets me this:

    regex02

    Months

    However that causes issues when I get to the month. I need a two digit month, but I can’t have some combinations of two digits. If I were to write [01][1-9], I’d get months like 18, which aren’t valid. Instead, I need a pattern that only matches a 0 with 1 to 9, and only allows a 1 with a 1 or 2.

    To do that, I’ll use an OR. That’s a pipe (|) in regular expressions. I’ll say (in pseudocode), give me a (01 to 09) OR a (10-12). The easy way to build that is like this:

    (0[1-9]|1[0-2])

    This says that if we match the first half (before the pipe), then we literally have a 0 there, with a second character in the range 1-9. That gives us 01 to 09. The second half, after the pipe, does the same thing, but it matches a literal “1”, and then a 0, 1, or 2. As you can see, I have random months (only showing this expression).

    regex03

    Days

    Now the hard part: days.

    Days are strange in the calendar because the possible days depend on the months. Years and months are consistently in ranges, but the days are not. Let’s start with the most common days: 31.

    I have 31 days in months 1, 3, 5, 7, 8, 11, 12. In order to match these up, I’ll need to combine the month and day items. Let’s first change our months to be just those particular months. That gives me:

    (0[13578]|1[02])

    With these months, I am going to allow up to 31 days. The patterns for the first 29 days of the month are the same. A 0, 1, or 2, with any combination of 1-9. Putting that together gives me:

    (0[13578]|1[02])([012][1-9])

    This handles the first 29. The next two, 30 and 31, are an OR expression like the months. I’ll use a literal 3 and a choice of zero or one. That gives me:

    regex04

    Whew! This is a lot of work, but it matches things up well. Now I need to handle 30 days. I’ll do that the same way, but I’ll now OR both expressions together. The expression is:

    ((0[13578]|1[02])([012][1-9]|3[01]))|((0[2469]|11)([012][1-9]|30))

    And the data:

    regex05

    That gets me almost all the months. The last part of February, the hardest. Now I could worry about leap years, but I’m not going to. Proper handling here means verifying the year (and century here) and doing math to ensure a leap year is viable. Instead, I’m going to just ignore the 30s and manage days 1 to 29.

    ((0[13578]|1[02])([012][1-9]|3[01]))|((0[2469]|11)([012][1-9]|30))|((02([012][1-9])))

    Now I have a nice set of random dates if I put everything together.

    [01][0-0][0-9](((0[13578]|1[02])([012][1-9]|3[01]))|((0[2469]|11)([012][1-9]|30))|((02([012][1-9]))))

    regex06

    References

    I leaned on a few examples to decode a few of the expressions and also to check that I wasn’t messing up.

  • Drop and Recreate

    Those of you that manage replicated environments have learned to have one thing handy: a script that recreates your replicated publishers, distributors, and subscribers. I was reminded of my past needs for those scripts recently when I saw this post on dropping and recreating all the synonyms for a database.

    It’s easy to depend on backup and restore to recover from issues, but how often do you face problems with an environment that aren’t related to data? If you lose a stored procedure, or have a problem with the configuration of jobs, or principals, can you easily drop and recreate an object? That code is usually tiny, but if the only copy you have is in a backup file, you have to restore a lot of data just to get some code.

    Certainly everyone should keep all this data in version control, and I’d encourage you to be sure that not only development code (tables, views, stored procedures, etc) are kept in there, but also configuration settings, jobs, roles, and the various other things a DBA is responsible for in a production environment.

    However I’d also go one step further and ensure that you have scripts to recreate all aspects of your environment if you need to do it. Many of the comparison tools will let you store a snapshot of database schema items in a folder and then easily help you recreate a script if needed. That covers the database, but for the instance level items, you need to be sure you have an easy way to checkout a copy from version control (you are using version control now, right?) and execute the scripts on a SQL Server. You can use T-SQL, PoSH, or even VBScript, but be sure you have the code handy.

    Do you?

    Steve Jones

    The Voice of the DBA Podcast

    Listen to the MP3 Audio ( 1.8MB) podcast or subscribe to the feed at iTunes and LibSyn.

  • The Last Job

    I was chatting with one of the more experienced SQL Server professionals I know recently and was surprised to know this person had actually retired, but come back to technology because they were bored with not working. I suspect that’s how I’ll be later in life, and am not really looking forward to retiring anytime soon.

    However I do think about jobs and employment as I age. I know that it can be tougher to keep a job over the long term. It seems the flexibility many of us appreciate as younger workers can be a detriment later in life when you value stability. With that in mind, here’s this week’s question:

    Is this the last full time, technology job you’ll have?

    I have an amazing job, perhaps the best one I could have imagined. I love what I do, but I do think about my options every year. I take some time to think about how my employment has gone in the past year, what else I might do and what I want to do in the future. I re-evaluate how I feel and try to be honest with myself about how I feel about my career. If I decide to make a change, I want it to be my decision, not something that’s forced upon me by a change in my employment status.

    I wonder if this will be my last job. I certainly think it could be, and the way it’s gone the last few years, I hope it is.

    Steve Jones

    The Voice of the DBA Podcast

    Listen to the MP3 Audio ( 1.5MB) podcast or subscribe to the feed at iTunes and LibSyn.