To read the article online, visit http://www.4GuysFromRolla.com/webtech/102300-1.3.shtml

Using Dynamic SQL Statements in Stored Procedures, Part 3

By Scott Mitchell


  • Read Part 1
  • Read Part 2

  • In Read Part 2 we looked at creating our first truly dynamic SQL statement within a stored procedure, and we examined how to call it from an ASP page. Now... you may be wondering why are we going to such painful lengths to do it this way for just one variable in a WHERE clause (especially since you can do it without dynamic SQL and a stored procedure parameter, like:

      CREATE PROCEDURE sp_MyFirstDynamicSP ( @LastName varchar(100) )
      AS
          SELECT FirstName, LastName, SSN, Salary
          FROM Employee
          WHERE LastName = @LastName
      
    )

    Well, as shown by the above example, it really doesn't make sense to use dynamic SQL in a stored procedure to just return rows based on one value in a WHERE clause. But imagine that you wanted to do more... like order the results based on a column that might change everytime! For example, say that in our Employee results, sometimes we wanted to order by LastName and then FirstName, while other times we want to order by Salary. This can be done in a stored procedure via dynamic SQL as well! Let's make a small change to our sp_MyFirstDynamicSP procedure to include a second parameter, @SortColumn.

    CREATE PROCEDURE sp_MyFirstDynamicSP
    (
       @EmployeeID varchar(100),
       @SortColumn varchar(100)
    )
    ...
    

    Now, we can alter our dynamic SQL statement to create an ORDER BY clause that is based on the value of @SortColumn:

    CREATE PROCEDURE sp_MyFirstDynamicSP
    (
       @EmployeeID varchar(100),
       @SortColumn varchar(100)
    )
        EXEC('SELECT FirstName, LastName, SSN, Salary
              FROM Employee
              WHERE LastName LIKE ''%' + @LastName + '%'' 
              ORDER BY ' + @SortColumn )
    

    From the ASP page, you want to pass in the column list that you wish to sort by. For example, if you wanted to list all employee's with a lastname containing the text mitchell and sort those results by the value of the Salary column in descending order, you'd call the stored procedure like so:

    Dim strSQL
    strSQL = "sp_MyFirstDynamicSP '" & Request("LastName") & "', 'Salary DESC' "

    If you wanted to sort by LastName and break ties by sorting on FirstName, you'd call the stored procedure like:

    Dim strSQL
    strSQL = "sp_MyFirstDynamicSP '" & Request("LastName") & "', 'LastName, FirstName' "

    I'll leave you with some advice from avid 4Guys visit Leo C., who shares his views on dynamic SQL in stored procedures:

    Here are some things to consider when deciding whether to use dynamic SQL in stored procedures:
    1. This only works with MS SQL Server, not Oracle or any version of Sybase that I have used.
    2. It is not sufficient to give execute permissions on the procedure to users, you have to grant permissions on the table(s).
    3. In spite of these problems, you can use this technique to handle, for example, 100 different medical practices, each with their own separate set of tables. The exec function will allow you to concatenate the different table names from variables, as long as the table names are identical except for some enumeration, such as the practice number.

    Happy Programming!

  • By Scott Mitchell


  • Article Information
    Article Title: Using Dynamic SQL Statements in Stored Procedures, Part 3
    Article Author: Scott Mitchell
    Published Date: Monday, October 23, 2000
    Article URL: http://www.4GuysFromRolla.com/webtech/102300-1.3.shtml


    Copyright 2017 QuinStreet Inc. All Rights Reserved.
    Legal Notices, Licensing, Permissions, Privacy Policy.
    Advertise | Newsletters | E-mail Offers