-- In all procedures there is an addition of a comment with a GUID in it.
-- Without it the UNPACK operation that runs with the same input as the JOIN
-- operation would get a cache hit that would distort the test results.
CREATE PROCEDURE unpack_with_union
                 @list      nvarchar(MAX),
                 @tbl       varchar(30),
                 @delimiter nchar(1) = N',' AS
DECLARE @sql nvarchar(MAX),
        @q1  char(1),
        @q2  char(2)
SELECT @q1 = char(39), @q2 = char(39) + char(39)
SELECT @sql = 'INSERT INTO ' + @tbl + ' SELECT ' +
               replace(replace(@list, @q1, @q2), @delimiter,
                       N' UNION ALL SELECT ') +
              ' -- ' + convert(char(36), newid())
--PRINT @sql
EXEC (@sql)
go

CREATE PROCEDURE unpackstr_with_union @list nvarchar(MAX), @tbl varchar(30), @delimiter nchar(1) = N',' AS DECLARE @sql nvarchar(MAX), @q1 char(1), @q2 char(2) SELECT @q1 = char(39), @q2 = char(39) + char(39) SELECT @sql = 'INSERT INTO ' + @tbl + ' SELECT ltrim(rtrim(''' + replace(replace(@list, @q1, @q2), @delimiter, N''')) UNION ALL SELECT ltrim(rtrim(''') + '''))' + ' -- ' + convert(char(36), newid()) --PRINT @sql EXEC (@sql) go
CREATE PROCEDURE unpack_with_selectvalues @list nvarchar(MAX), @tbl varchar(30), @delimiter nchar(1) = N',' AS DECLARE @sql nvarchar(MAX), @q1 char(1), @q2 char(2) SELECT @q1 = char(39), @q2 = char(39) + char(39) SELECT @sql = 'INSERT INTO ' + @tbl + ' SELECT n FROM (VALUES(' + replace(replace(@list, @q1, @q2), @delimiter, N' ), (') + ')) AS a(n) ' + ' -- ' + convert(char(36), newid()) --PRINT @sql EXEC (@sql) go
CREATE PROCEDURE unpackstr_with_selectvalues @list nvarchar(MAX), @tbl varchar(30), @delimiter nchar(1) = N',' AS DECLARE @sql nvarchar(MAX), @q1 char(1), @q2 char(2) SELECT @q1 = char(39), @q2 = char(39) + char(39) SELECT @sql = 'INSERT INTO ' + @tbl + ' SELECT str FROM (VALUES(ltrim(rtrim(''' + replace(replace(@list, @q1, @q2), @delimiter, N'''))), (ltrim(rtrim(''') + ''')))) AS a(str)' + ' -- ' + convert(char(36), newid()) --PRINT @sql EXEC (@sql) go
CREATE PROCEDURE unpack_with_insert2008 @list nvarchar(MAX), @tbl varchar(30), @delimiter nchar(1) = N',' AS DECLARE @sql nvarchar(MAX), @q1 char(1), @q2 char(2) SELECT @q1 = char(39), @q2 = char(39) + char(39) SELECT @sql = 'INSERT ' + @tbl + ' VALUES (' + replace(replace(@list, @q1, @q2), @delimiter, '), (') + ')' + ' -- ' + convert(char(36), newid()) --PRINT @sql EXEC (@sql) go
CREATE PROCEDURE unpackstr_with_insert2008 @list nvarchar(MAX), @tbl varchar(30), @delimiter nchar(1) = N',' AS DECLARE @sql nvarchar(MAX), @q1 char(1), @q2 char(2) SELECT @q1 = char(39), @q2 = char(39) + char(39) SELECT @sql = 'INSERT ' + @tbl + ' VALUES (ltrim(rtrim(''' + replace(replace(@list, @q1, @q2), @delimiter, '''))), (ltrim(rtrim(''') + ''')))' + ' -- ' + convert(char(36), newid()) --PRINT @sql EXEC (@sql) go
CREATE PROCEDURE unpack_with_insert @list nvarchar(MAX), @tbl varchar(30), @delimiter nchar(1) = N',' AS DECLARE @sql nvarchar(MAX), @q1 char(1), @q2 char(2) SELECT @q1 = char(39), @q2 = char(39) + char(39) SELECT @sql = 'INSERT ' + @tbl + ' VALUES (' + replace(replace(@list, @q1, @q2), @delimiter, ') INSERT ' + @tbl + ' VALUES (') + ')' + ' -- ' + convert(char(36), newid()) --PRINT @sql EXEC (@sql) go
CREATE PROCEDURE unpackstr_with_insert @list nvarchar(MAX), @tbl varchar(30), @delimiter nchar(1) = N',' AS DECLARE @sql nvarchar(MAX), @q1 char(1), @q2 char(2) SELECT @q1 = char(39), @q2 = char(39) + char(39) SELECT @sql = 'INSERT ' + @tbl + ' VALUES (ltrim(rtrim(''' + replace(replace(@list, @q1, @q2), @delimiter, '''))) INSERT ' + @tbl + ' VALUES (ltrim(rtrim(''') + ''')))' + ' -- ' + convert(char(36), newid()) --PRINT @sql EXEC (@sql) go
CREATE PROCEDURE unpack_with_manyselect @list nvarchar(MAX), @tbl varchar(30), @delimiter nchar(1) = ',' AS DECLARE @sql nvarchar(MAX), @q1 char(1), @q2 char(2) SELECT @q1 = char(39), @q2 = char(39) + char(39) SELECT @sql = 'INSERT ' + @tbl + ' EXEC(' + @q1 + 'SELECT ' + replace(replace(@list, @q1 COLLATE Slovenian_BIN2, @q2 + @q2), @delimiter COLLATE Slovenian_BIN2, ' SELECT ') + ' -- ' + convert(char(36), newid()) + @q1 + ')' --PRINT @sql EXEC (@sql) go
CREATE PROCEDURE unpackstr_with_manyselect @list nvarchar(MAX), @tbl varchar(30), @delimiter nchar(1) = ',' AS DECLARE @sql nvarchar(MAX), @q1 char(1), @q2 char(2) SELECT @q1 = char(39), @q2 = char(39) + char(39) SELECT @sql = 'INSERT ' + @tbl + ' EXEC(' + @q1 + 'SELECT ltrim(rtrim(' + @q2 + replace(replace(@list, @q1 COLLATE Slovenian_BIN2, @q2 + @q2), @delimiter COLLATE Slovenian_BIN2, @q2 + ')) SELECT ltrim(rtrim(' + @q2) + @q2 + '))' + ' -- ' + convert(char(36), newid()) + @q1 + ')' --PRINT @sql EXEC (@sql) go