Category: Blog

  • Getting Information from a Database using Dynamic SQL

    I ran across someone that was building a restore script to automated their restores. This person wanted their script to work with any instance, and that means they’d need to find the path for the database files, if the database already existed.

    It was interesting to me, and I decided to give a solution a try, and I ended up using dynamic SQL, which I don’t love, but it worked. As I was digging through, I realized that all the database data is in sys.master_files. However I’d started this and it was an intriguing problem. I don’t love this solution, and I wouldn’t use it here, but there might be a place where you can use it.

    To find out if a database exists, you can easily use the sys.databases view to find it.

    USE master
    GO
    DECLARE @path VARCHAR(500)
       , @db VARCHAR(200)
    ;
    
    SELECT @db = 'AdventureWorks2008'
    
    IF EXISTS (SELECT name
             FROM sys.databases
     WHERE name = @db
     )

    This is a snippet, and you need more code for this to work, but it does work if you include the “then” and “else” blocks. If the database doesn’t exist, you can grab the default file paths from the registry if you want to build the restore script, but if it does, then what.

    You want to find the database files, but these aren’t stored in master. If you query sys.database_files, you’ll get this:

    dbfilepath

    I have 8 or 10 databases on this instance, but none appear. However if I query a specific database, I get the files.

    dbfilepath2

    How do I get this data, in a script, given that I can’t execute a “use” statement easily at runtime.

    There are probably a few ways, but for me, I decided dynamic SQL might make sense her. This is an administrative task, so it’s not likely to allow for SQL Injection as I wouldn’t expose this for users to run.

    The first step is to build my query. In this case, I want to execute this query:

     select physical_name
      from AdventureWorks2008.sys.database_files
       where file_id = 1

    This isn’t ideal, in that I could have many files for this database, but for now I’m concerned with just getting the primary data file.

    I can build this string dynamically like this. Note that I’ve assigned the result to a variable for now.

    DECLARE @sqlCommand nvarchar(1000)
    DECLARE @db varchar(75)
    DECLARE @file VARCHAR(500)
    SET @db = 'AdventureWorks2008'
    SET @sqlCommand = 'select @f = physical_name from ' + @db + '.sys.database_files where file_id = 1'
    
    SElect @sqlCommand

    However now I need to run this command and return a value. sp_executesql is a function that allows you to execute a string, pass in parameters, and assign them back. I can do this with this script.

    DECLARE @sqlCommand nvarchar(1000)
    DECLARE @db varchar(75)
    DECLARE @file VARCHAR(500)
    
    SET @db = 'AdventureWorks2008'
    SET @sqlCommand = 'select @f = physical_name from ' + @db + '.sys.database_files where file_id = 1'
    
    EXECUTE sp_executesql @sqlCommand, N'@f varchar(500) OUTPUT', @f=@file OUTPUT
    
    select @file

    If I run this, I’ll get the file path from the AdventureWorks2008 primary data file.

    That’s the first step in this process. If I wanted to complete it, I’d have to make sure I did this for each data file, probably using some temporary table instead of a variable, and storing all the physical paths and logical names, and using those to build a dynamic restore script.

    Or I could download this script: SQL 2005 Restore Script Generator

  • Software Design and Schizophrenic Windows 8 Part 2

    I know it’s not schizophrenic, but that sounds better. It’s really a split personality.

    I wrote recently about Windows 8 and what I consider to be poor design in the update system. Today I want to look at another aspect that troubles me.

    Programs

    I’ve gotten used to the taskbar and finding the applications I need. I actually pin 12 applications to my bar because I use them on a daily basis and it’s much easier to start them from the task bar.

    I actually have gotten used to finding applications (other than Windows Update) on the Start Screen by typing the name. I know this worked in Windows 7, and I should always have been doing this, but the design of Win 8 actually forced me to get in the habit of hitting the Windows key and then typing the first 3-5 characters of the application name.

    In any case, here’s my taskbar.

    win8_schizo_3

    I’m running a number of apps, almost all of these are active. If I hover the mouse over any of them, I can find them. It’s no four-finger up swipe in OSX, but it works very well for finding stuff.

    Most stuff.

    I actually was running the Mail app in Windows a minute ago, however it’s not on my taskbar. I have to do one of a few things to find it. I can put my mouse in the upper left corner, and I’ll see it as thumbnail.

    win8_schizo_e

    I an alt+tab through my list of stuff and find it there, but that’s slow. I’d also say hovering I the upper left corner to be slow (to me).

    Schizophrenic.

    I also had the People app running. That’s in my alt+tab list, but quite by accident I realized that if I hover my mouse in the upper left and then move it slightly down, I get this:

    win8_schizo_f

    A list of the running metro-style applications.

    Now I have two task bars. One at the bottom of both my monitors (it’s duplicated) and a separate one on the left side of my screen (either one), if I correctly move my mouse along the left side of the screen. I don’t always do it correctly, and so switching to the metro apps becomes a little dicey at times, usually slow, and occasionally maddening.

    I thought we learned a long time ago that two separate menus was poor design.

    I don’t mind the idea of the left hand bar. It’s fine, and if it’s ergonomically better, great. Get people to move that way. However make sure you’ve integrated into the taskbar at the same time. Don’t give me two places that do the same thing for different items. Give me consistency.

  • Not My Google Reader Replacement

    Someone suggested Newsblur to me, and I went to their home page. Like many sites, it asks you to sign up, so I decided to give it a try.

    newsblur2

    The import from Google Reader caught my attention, so I clicked it. It asked for an authorization from Google, and then I got this page:

    newsblur

    I have to say. Not only do I now see anyway to understand the difference between $2 a month and $3 a month, but I also feel like this is a bait and switch, given the top banner. This could have been called out on the home page, though I suspect not as many people will click through.

    I’d gladly pay Google Reader $2 a month, but I know what I’m getting. Here I’m not sure, and I’m already annoyed.

    The search continues.

  • T-SQL Tuesday #42–The Long and Winding Road

    tsqltuesdayIt’s T-SQL Tuesday time, this month hosted by Wendy Pastrick who asks you to talk about the Long and Winding Road. Wendy asks us to talk about your job, your road map to the future, and what might be in store for you.

    T-SQL Tuesday is a monthly blog party on the second Tuesday of each month, hosted by a different person. You can participate by writing a blog post on the topic for the month and following a few rules that you’ll find in Wendy’s invitation.

    If you want to host yourself one month, contact Adam Machanic (@AdamMachanic).

    The Long and Winding Road

    I’ve been in the same job for about 11 years: the editor of SQLServerCentral as my primary role. About 6 years ago, Red Gate Software bought the site, and I now work for them. The job is mostly the same, though a couple things have changed over the years. Three years ago I made an effort to begin speaking more, both on technical topics as well as Red Gate software. I’ve had a busy speaking schedule across that time, and I’m scheduled for about 15 events in 2013.

    That change in speaking for me, along with the SQL in the City events that Red Gate sponsors keeps me busy with building presentations and delivering them all over the world.

    These events are designed to provide attendees with free training just like other conferences with one exception: we can talk about Red Gate tools. The sessions I do aren’t marketing talks about the tools, but rather presentations about things you should do in your environment, but I do show how the tools Red Gate provides makes these tasks easier. That’s the idea behind our tools: they make you more productive.

    This year that has meant I’m moving a little bit away from the administration areas where I spent most of my career and back into some development work. I’ve been setting up Git and working with source control, learning about Continuous Integration, and more. Mostly this is to support the work Red Gate is doing on Deployment Manager, which I think is a great idea. It solves a lot of problems and hassles that I’ve dealt with when developing software. I’m excited, and looking forward to seeing how people like the tool, as well as watching it evolve based on feedback.

    I have no plans to leave my job or Red Gate in the foreseeable future. The position I’m in is unique, and I don’t expect to move up, or around, in the company because of that, but that’s OK.

    I have the best job in the world.