How do I simulate an array inside a stored procedure?
Passing in an array
Often you will want to pass an array to a stored procedure and have the procedure loop through and process each element in the array. Unfortunately, T-SQL does not have an array datatype.
Erland Sommarskog recently wrote an article entitled Arrays and Lists in SQL Server which is really worth a read. Ken Henderson's latest book, Amazon.com: The Guru's Guide to SQL Serv..., has a section on dealing with arrays in T-SQL, with extended stored procedures (accompanied by source code) on the CD-Rom. His method actually adds array support to T-SQL, rather than work around its absence.
While you're waiting for the book to arrive, or for Erland's article to print out <G>, what you can do instead, is pass in a list of comma-delimited strings and parse it out, inserting it into a temp table of your choice. For example:
Then you could use this procedure, for example, to do something like this:
Only minor changes if you are using a comma-separated list of VARCHAR values:
Then you call it like this:
This eliminates the need, for example, to limit your lists to 4,000 or 2,667 characters when they're used multiple times in a single dynamic SQL statement. Instead, you could just join against the #temp table (and use up to 8,000 characters).
Using a table-valued function
Sometimes you have a list stored in a table, e.g.
Now, you want those values back in a resultset like follows:
Doing so from the table directly would be pretty ugly. You could use an interim temp table and a procedure such as the above, or you could use a table-valued UDF in SQL Server 2000.
Now, it's as simple as:
And here's a trick from Anith Sen's, well, bag of tricks. It uses a numbers table (see Article #2516).
You could put that functionality into a table-valued function as well, but I'll leave that as an exercise to the reader.
Generating an array from a string
Related ArticlesHow do I build a query with optional parameters?
How do I calculate the median in a table?
How do I create a store locator feature?
How do I deal with MEMO, TEXT, HYPERLINK, and CURRENCY columns?
How do I deal with multiple resultsets from a stored procedure?
How do I debug my SQL statements?
How do I determine if a column exists in a given table?
How do I enable or disable connection pooling?
How do I enumerate through the DSNs on a machine?
How do I find a stored procedure containing <text>?
How do I get a list of Access tables and their row counts?
How do I get the latest version of the JET OLEDB drivers?
How do I handle alphabetic paging?
How do I handle BIT / BOOLEAN columns?
How do I handle error checking in a stored procedure?
How do I ignore common words in a search?
How do I page through a recordset?
How do I present one-to-many relationships in my ASP page?
How do I prevent duplicates in a table?
How do I prevent my ASP pages from waiting for backend activity?
How do I prevent NULLs in my database from mucking up my HTML?
How do I protect my Access database (MDB file)?
How do I protect my stored procedure code?
How do I protect myself against the W32.Slammer worm?
How do I remove duplicates from a table?
How do I rename a column?
How do I retrieve a random record?
How do I return row numbers with my query?
How do I send a database query to a text file?
How do I solve 'Could not find installable ISAM' errors?
How do I solve 'Operation must use an updateable query' errors?
How do I temporarily disable a trigger?
How do I use a SELECT list alias in the WHERE or GROUP BY clause?
How do I use a variable in an ORDER BY clause?
Should I index my database table(s), and if so, how?
Should I store images in the database or the filesystem?
Should I use a #temp table or a @table variable?
Should I use a view, a stored procedure, or a user-defined function?
Should I use recordset iteration, or GetRows(), or GetString()?
What are all these dt_ stored procedures, and can I remove them?
What are the limitations of MS Access?
What are the limitations of MSDE?
What are the valid styles for converting datetime to string?
What datatype should I use for my character-based database columns?
What datatype should I use for numeric columns?
What does "ambiguous column name" mean?
What is this 'Multiple-step OLE DB' error?
What is wrong with 'SELECT *'?
What naming convention should I use in my database?
What should I choose for my primary key?
What should my connection string look like?
When should I use CreateObject to create my recordset objects?
Where can I get this 'Books Online' documentation?
Where do I get MSDE?
Which database platform should I use for my ASP application?
Which tool should I use: Enterprise Manager or Query Analyzer?
Why are there gaps in my IDENTITY / AUTOINCREMENT column?
Why can I not 'open a database created with a previous version...'?
Why can't I access a database or text file on another server?
Why can't I use the TOP keyword?
Why do I get 'Argument data type text is invalid for argument [...]'?
Why do I get 'Not enough space on temporary disk' errors?
Why does ASP give me ActiveX errors when connecting to a database?
Should I use COALESCE() or ISNULL()?
Where can I get basic info about using stored procedures?