Everyone knows you should use Stored Procedures instead of dynamic SQL. This debate has raged on and on in the various newsgroups and the verdict is clear, USE STORED PROCEDURES. But if you don't care about Security, Performance, Maintainability or Scalability and still shun Stored Procedures, at least use Parameters.
That's old hat right? Well, there are some times Dynamic SQL has its uses (although they are quite limited). One of the more frequent things I've come across is people shunning Stored Procs because you can't pass a Delimmited Parameter into your proc and use it in and IN Clause. So if you passed in a value that was something like this,
| SqlCommand cmd = new SqlCommand(); cmd.Parameters.Add("@DelimitedString", "1,2,3,4,5,6"); |
| SELECT * FROM myTable WHERE Department IN(@DelimetedString) |
| DECLARE @Token AS VARCHAR(50) DECLARE @Temp AS VARCHAR(50) DECLARE @In INT CREATE TABLE #HOLDER(FirstVal VARCHAR(50)) WHILE LEN(@Token) > 0 BEGIN IF CHARINDEX(',', @Token) =0 BEGIN SET @TEMP =@Token SET @TOken = '' INSERT INTO #Holder (FirstVal) VALUES(@Temp) END ELSE BEGIN SET @Temp = LEFT(@Token, CHARINDEX(',', @Token)-1) INSERT INTO #Holder (FirstVal) VALUES(@Temp) SET @Token = RIGHT(@Token, LEN(@Token)-LEN(@Temp)-1) END END SELECT * FROM BlahBLahBLah WHERE SomeField IN (SELECT FirstVal FROM #Holder) |
| OR SqlCommand cmd = new SqlCommand(); cmd.Parameters.Add("@Token", "1,2,3,4,5,6"); cmd.CommandType = CommandType.StoredProcedure; dr = cmd.ExecuteReader(); CREATE PROCEDURE usp_MyParserForIN @Token AS VARCHAR(50)--or whatever length you'll need AS DECLARE @Temp AS VARCHAR(50) CREATE TABLE #HOLDER(FirstVal VARCHAR(50)) WHILE LEN(@Token) > 0 BEGIN IF CHARINDEX(',', @Token) =0 BEGIN SET @TEMP =@Token SET @TOken = '' INSERT INTO #Holder (FirstVal) VALUES(@Temp) END ELSE BEGIN SET @Temp = LEFT(@Token, CHARINDEX(',', @Token)-1) INSERT INTO #Holder (FirstVal) VALUES(@Temp) SET @Token = RIGHT(@Token, LEN(@Token)-LEN(@Temp)-1) END END SELECT * FROM BlahBLahBLah WHERE SomeField IN (SELECT FirstVal FROM #Holder) |