[AccessD] OT: T-SQL 2005 - Building lookup rows from string...

Salakhetdinov Shamil mcp2004 at mail.ru
Fri Feb 27 07:42:11 CST 2009


Hi All,

Inspired by David response and using the following greate T-SQL dynamic programmic sources:

http://www.sommarskog.se/dynamic_sql.html#sp_executesqlong

http://www.sommarskog.se/arrays-in-sql-2005.html

I have got written a couple of UDF and SP to get lookup values wrapped into a string and "unwrapped back" to a table. The code of those UDF and SP follows. Please note that dynamic T-SQL has some security limitations. The code was tested with MS SQL 2005 Northwind sample database. Writing this code was an exercize to prepare to develop advanced XREF T-SQL quesries for a real customer. I hope you can find posted T-SQL code and URLs on dynamic SQL programming issue useful.

Thank you.

--
Shamil

P.S. Code (watch line wraps!):

--
-- -- SAMPLE CALL --
-- select * from udf_LookupListToTable('1,Beverages,2,Condiments,3,Confections,4,Dairy Products,5,Grains/Cereals,6,Meat/Poultry,7,Produce,8,Seafood')
--
CREATE FUNCTION udf_LookupListToTable (@list nvarchar(MAX))
   RETURNS @tbl TABLE (id int NOT NULL, [name] nvarchar(128)) AS

BEGIN
   DECLARE @pos        int,
           @nextpos    int,
           @valuelen   int

   SELECT @pos = 0, @nextpos = 1

   WHILE @nextpos > 0
   BEGIN
     
     DECLARE @index int,
             @id int,
             @name nvarchar(128)
     SET @index = 2
     WHILE @index > 0
     BEGIN 
      SELECT @nextpos = charindex(',', @list, @pos + 1)
      SELECT @valuelen = CASE WHEN @nextpos > 0
                              THEN @nextpos
                              ELSE len(@list) + 1
                         END - @pos - 1
      if @index = 2
        SET @id = convert(int, substring(@list, @pos + 1, @valuelen))
      if @index = 1
      begin
        SET @name = substring(@list, @pos + 1, @valuelen)
        INSERT @tbl (id, [name])
          VALUES (@id, @name)
      end
      SELECT @pos = @nextpos
      set @index = @index - 1
     END
   END
  RETURN
END
GO

--
-- -- SAMPLE CALL --
-- declare @resultList nvarchar(MAX)
-- EXEC SP_LookupTableToList 'Categories','CategoryId','CategoryName', 
--                            @resultList out
-- -- print @resultList
-- select * from udf_LookupListToTable(@resultList)
ALTER PROCEDURE [dbo].[SP_LookupTableToList] 
	  @tableName nvarchar(128),
	  @idFieldName nvarchar(128),
	  @valueFieldName nvarchar(128),
      @resultList nvarchar(4000) OUT
AS
BEGIN
	SET NOCOUNT ON;

    DECLARE @tbl TABLE (ResultList nvarchar(max))


	DECLARE @resultListColumnName nvarchar(128),
            
            @sql nvarchar(4000)

    set @resultListColumnName = 'ResultList'

	set @sql = 
	'
    SELECT 
	REPLACE(
	(
	  SELECT 
		CAST(@idFieldName as nvarchar(126)) + '','' + 
		@valueFieldName + '','' 
		FROM @tableName
		ORDER BY @valueFieldName
		FOR XML PATH('''')
	) + ''-'',
	'',-'','''')
	as @resultListColumnName'

	set @sql = REPLACE(@sql,'@tableName', at tableName)
	set @sql = REPLACE(@sql,'@idFieldName', at idFieldName)
	set @sql = REPLACE(@sql,'@valueFieldName', at valueFieldName)
	set @sql = REPLACE(@sql,'@resultListColumnName', at resultListColumnName)

    INSERT @tbl(ResultList) EXEC (@sql)

    SELECT @resultList = [ResultList] from @tbl

END
GO







More information about the AccessD mailing list