/*
*** DO NOT USE IN PRODUCTION -- TESTING / DEMONSTRATION CODE ONLY ***
This script relates to the following SQL Server Central Forum topic:
Processing strings ( https://www.sqlservercentral.com/forums/topic/processing-strings )
*** DO NOT USE IN PRODUCTION -- TESTING / DEMONSTRATION CODE ONLY ***
The Assembly below is compiled against .NET Framework version 3.5 so that it will work in SQL Server 2008
and newer (i.e. all versions that support SQLCLR outside of SQL Server 2005). The Assembly does require
having a PERMISSION_SET of UNSAFE due to the TextFieldParser class having a Host Protection Attribute, but
the database does not need to have TRUSTWORTHY set to ON since the Assembly is signed, an Asymmetric Key
is created from the Assembly, and a Login is created from that Asymmetric Key and granted the appropriate
permission.
*** DO NOT USE IN PRODUCTION -- TESTING / DEMONSTRATION CODE ONLY ***
The .NET / C# source code for the [ParseCSV] and [GarbageCollect] SQLCLR Stored Procedures is located at:
https://pastebin.com/BY8F994R
*** DO NOT USE IN PRODUCTION -- TESTING / DEMONSTRATION CODE ONLY ***
A T-SQL script containing tests for the [ParseCSV] SQLCLR Stored Procedure is located at:
https://pastebin.com/WGDkQTxt
*** DO NOT USE IN PRODUCTION -- TESTING / DEMONSTRATION CODE ONLY ***
Date: 2016-04-11
Version: 1.0.0
For more functions like this, please visit: https://SQLsharp.com
Stairway to SQLCLR series: https://www.sqlservercentral.com/stairways/stairway-to-sqlclr
Copyright (c) 2016 Sql Quantum Leap. All rights reserved.
https://SqlQuantumLeap.com
*/
SET ANSI_NULLS, ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER ON;
SET NUMERIC_ROUNDABORT OFF;
SET NOCOUNT ON;
GO
USE [master];
GO
-- DROP DATABASE [CSVParser];
IF (DB_ID(N'CSVParser') IS NULL)
BEGIN
PRINT N'Creating DB: CSVParser...';
DECLARE @DataPath NVARCHAR(500) = CONVERT(NVARCHAR(500), SERVERPROPERTY('InstanceDefaultDataPath'));
DECLARE @LogPath NVARCHAR(500) = CONVERT(NVARCHAR(500), SERVERPROPERTY('InstanceDefaultLogPath'));
EXEC('
CREATE DATABASE [CSVParser]
ON PRIMARY
( NAME = N''CSVParser'', FILENAME = N''' + @DataPath + N'CSVParser.mdf'', SIZE = 4160KB, MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ),
FILEGROUP [UserData] DEFAULT
( NAME = N''CSVParser_UserData'', FILENAME = N''' + @DataPath + N'CSVParser_UserData.ndf'', SIZE = 512000KB, MAXSIZE = UNLIMITED, FILEGROWTH = 20480KB )
LOG ON
( NAME = N''CSVParser_log'', FILENAME = N''' + @LogPath + N'CSVParser_log.ldf'' , SIZE = 512000KB, MAXSIZE = UNLIMITED, FILEGROWTH = 20480KB )
COLLATE Latin1_General_100_CI_AS;
');
END;
GO
-- Make sure "CLR Integration" feature is enabled.
IF (EXISTS(
SELECT sc.*
FROM sys.configurations sc
WHERE sc.[name] = N'clr enabled'
AND sc.[value_in_use] = 0
)
)
BEGIN
EXEC sp_configure 'clr enabled', 1;
RECONFIGURE;
END;
GO
--------------------------------------------------------------------------------
DECLARE @ErrorMessage NVARCHAR(4000);
-- We first need to create the Assembly containing just
-- the Key info so that we can get the "thumbprint" /
-- "publickeytoken" value from it. That value is used to
-- determine if the Asymmetric Key and Login already exist.
--
-- We only need this Assembly temporarily, so create within
-- a transaction to guarantee cleanup if something fails.
DECLARE @AssemblyName sysname, -- keep lower-case for servers with case-sensitive / binary collations
@AsymmetricKeyName sysname, -- keep lower-case for servers with case-sensitive / binary collations
@LoginName sysname, -- keep lower-case for servers with case-sensitive / binary collations
@PublicKeyToken VARBINARY(32),
@SQL NVARCHAR(MAX);
SET @AssemblyName = N'$ParseCSV-TEMPORARY-KeyInfo$';
SET @AsymmetricKeyName = N'ParseCSV_PermissionKey';
SET @LoginName = N'ParseCSV_PermissionLogin';
BEGIN TRY
BEGIN TRAN;
IF (NOT EXISTS(
SELECT *
FROM [sys].[assemblies] sa
WHERE [sa].[name] = @AssemblyName
)
)
BEGIN
SET @SQL = N'
CREATE ASSEMBLY [' + @AssemblyName + N']
AUTHORIZATION [dbo]
FROM 0x\
4D5A90000300000004000000FFFF0000B80000000000000040000000000000000000000000000000000000000000000000000000000000000000000080000000\
0E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000\
504500004C010300A2270D570000000000000000E00002210B010B000008000000060000000000008E2700000020000000400000000000100020000000020000\
040000000000000004000000000000000080000000020000C5670000030040850000100000100000000010000010000000000000100000000000000000000000\
3C2700004F000000004000008803000000000000000000000000000000000000006000000C000000042600001C00000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000200000080000000000000000000000082000004800000000000000000000002E74657874000000\
94070000002000000008000000020000000000000000000000000000200000602E72737263000000880300000040000000040000000A00000000000000000000\
00000000400000402E72656C6F6300000C0000000060000000020000000E00000000000000000000000000004000004200000000000000000000000000000000\
70270000000000004800000002000500D02000003405000009000000000000000000000000000000502000008000000000000000000000000000000000000000\
0000000000000000000000000000000021825CA57CEFEAE870FEB0BE5DE042034E8CD55998648C18E2F34352CAE75AC234CE23DD8C72000718318C44021EEBE7\
30437D0422C4CA2C55E72B42121FF9FD7BD74E42DC5FBDEC84B1C89495E46D0E25E51CE297D53FBCDDDB187E0EA309D29679C18954E9777DA0613F550A3EDD6B\
6B718323B38BA79423DC10891A68BA8142534A4201000100000000000C00000076322E302E35303732370000000005006C0000005C010000237E0000C8010000\
E001000023537472696E677300000000A80300000800000023555300B0030000100000002347554944000000C00300007401000023426C6F6200000000000000\
02000001071400000900000000FA253300160000010000000E000000010000000D0000000B000000010000000100000000000A00010000000000060031001F00\
06004E001F0006006B001F0006008A001F000600A3001F000600BC001F000600D7001F000600F2001F0006000B011F00060024011F000600540141012F006801\
00000600970177010600B70177010000000001000000000001000100090048000A00110048000A00190048000A00210048000A00290048000A00310048000A00\
390048000A00410048000A00490048000A00510048000A00590048000F00690048001500710048001A002E000B00C0002E001300CD002E001B00CD002E002300\
D3002E002B00E9002E003300F8002E003B00CD002E00530037012E005B0042012E0063004B012E006B005401048000000100000000000000010000001E00D501\
000002000000000000000000000001001600000000000000003C4D6F64756C653E004B6579496E666F2E646C6C006D73636F726C69620053797374656D2E5265\
666C656374696F6E00417373656D626C795469746C65417474726962757465002E63746F7200417373656D626C794465736372697074696F6E41747472696275\
746500417373656D626C79436F6E66696775726174696F6E41747472696275746500417373656D626C79436F6D70616E7941747472696275746500417373656D\
626C7950726F6475637441747472696275746500417373656D626C79436F7079726967687441747472696275746500417373656D626C7954726164656D61726B\
41747472696275746500417373656D626C7943756C7475726541747472696275746500417373656D626C7956657273696F6E4174747269627574650041737365\
6D626C7946696C6556657273696F6E4174747269627574650053797374656D2E446961676E6F73746963730044656275676761626C6541747472696275746500\
446562756767696E674D6F6465730053797374656D2E52756E74696D652E436F6D70696C6572536572766963657300436F6D70696C6174696F6E52656C617861\
74696F6E734174747269627574650052756E74696D65436F6D7061746962696C697479417474726962757465004B6579496E666F000000000003200000000000\
6036241041F8144E90E76B3EC924FEF50008B77A5C561934E089042001010E05200101113104200101080320000180A000240000048000009400000006020000\
00240000525341310004000001000100179540030702B7AAA3C324F40B7D6E3FA4C86131039CF02103D5BEFCECB6EB8738A7103340555BD6806E222448420F9C\
6DA8EF1E9EB72D12328977819BE03687859DB5F1B577EA021E67C5AB440A86DBAE6AAD68ED0FFA2A55EFA5B8DE0BE377102E55FD2E4E8571EB7F5580965F88E5\
A478C56CB8E3EC7ADDFEF48E1A7054B60C0100074B6579496E666F00000501000000001501001053716C205175616E74756D204C65617000000E010009435356\
50617273657200003E010039436F707972696768742028632920323031362053716C205175616E74756D204C6561702E20416C6C207269676874732072657365\
727665642E00000A010005312E302E3000000801000701000000000801000800000000001E01000100540216577261704E6F6E457863657074696F6E5468726F\
7773010000000000A2270D5700000000020000001C010000202600002008000052534453F9FB80892398AC4EBC9459538CBEE79301000000633A5C50686F656E\
697850726F6A6563745C41727469636C65735C5374616972776179546F53514C434C525C52656C617465645C50617273696E674353565C435356506172736572\
5C4B6579496E666F5C6F626A5C44656275675C4B6579496E666F2E70646200000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064270000\
00000000000000007E27000000200000000000000000000000000000000000000000000070270000000000000000000000005F436F72446C6C4D61696E006D73\
636F7265652E646C6C0000000000FF25002000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000100100000001800008000000000000000000000000000000100010000003000008000000000000000000000000000000100\
000000004800000058400000300300000000000000000000300334000000560053005F00560045005200530049004F004E005F0049004E0046004F0000000000\
BD04EFFE00000100000001000000000000000100000000003F000000000000000400000002000000000000000000000000000000440000000100560061007200\
460069006C00650049006E0066006F00000000002400040000005400720061006E0073006C006100740069006F006E00000000000000B0049002000001005300\
7400720069006E006700460069006C00650049006E0066006F0000006C020000010030003000300030003000340062003000000044001100010043006F006D00\
700061006E0079004E0061006D00650000000000530071006C0020005100750061006E00740075006D0020004C00650061007000000000003800080001004600\
69006C0065004400650073006300720069007000740069006F006E00000000004B006500790049006E0066006F0000002C0006000100460069006C0065005600\
65007200730069006F006E000000000031002E0030002E003000000038000C00010049006E007400650072006E0061006C004E0061006D00650000004B006500\
790049006E0066006F002E0064006C006C00000098003A0001004C006500670061006C0043006F007000790072006900670068007400000043006F0070007900\
720069006700680074002000280063002900200032003000310036002000530071006C0020005100750061006E00740075006D0020004C006500610070002E00\
200041006C006C0020007200690067006800740073002000720065007300650072007600650064002E00000040000C0001004F0072006900670069006E006100\
6C00460069006C0065006E0061006D00650000004B006500790049006E0066006F002E0064006C006C00000034000A000100500072006F006400750063007400\
4E0061006D006500000000004300530056005000610072007300650072000000300006000100500072006F006400750063007400560065007200730069006F00\
6E00000031002E0030002E003000000038000800010041007300730065006D0062006C0079002000560065007200730069006F006E00000031002E0030002E00\
30002E00300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
002000000C0000009037000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
WITH PERMISSION_SET = SAFE;
';
EXEC (@SQL);
END;
SET @PublicKeyToken = CONVERT(VARBINARY(32), ASSEMBLYPROPERTY(@AssemblyName, 'PublicKey'));
IF (NOT EXISTS(
SELECT *
FROM [sys].[asymmetric_keys] sak
WHERE sak.[thumbprint] = @PublicKeyToken
)
)
BEGIN
SET @SQL = N'
CREATE ASYMMETRIC KEY [' + @AsymmetricKeyName + N']
AUTHORIZATION [dbo]
FROM ASSEMBLY [' + @AssemblyName + N'];';
EXEC (@SQL);
END;
SET @SQL = N'DROP ASSEMBLY [' + @AssemblyName + N'];';
EXEC (@SQL);
COMMIT TRAN;
END TRY
BEGIN CATCH
IF (@@TRANCOUNT > 0)
BEGIN
ROLLBACK TRAN;
END;
SET @ErrorMessage = ERROR_MESSAGE();
RAISERROR(@ErrorMessage, 16, 1);
RETURN; -- exit the script
END CATCH;
-- If the Asymmetric Key exists but the Login does not exist, we need to:
-- 1) Create the Login
-- 2) Grant the appropriate permission
IF (EXISTS(
SELECT *
FROM [sys].[asymmetric_keys] sak
WHERE sak.[thumbprint] = @PublicKeyToken
)
) AND
(NOT EXISTS(
SELECT *
FROM [sys].[server_principals] sp
INNER JOIN [sys].[asymmetric_keys] sak
ON sak.[sid] = sp.[sid]
WHERE sak.[thumbprint] = @PublicKeyToken
)
)
BEGIN
BEGIN TRY
BEGIN TRAN;
SET @SQL = N'
CREATE LOGIN [' + @LoginName + N']
FROM ASYMMETRIC KEY [' + @AsymmetricKeyName + N'];';
EXEC (@SQL);
SET @SQL = N'
-- GRANT EXTERNAL ACCESS ASSEMBLY TO [' + @LoginName + N'];
-- OR, comment out the GRANT statement above, and uncomment the following:
GRANT UNSAFE ASSEMBLY TO [' + @LoginName + N'];
';
EXEC (@SQL);
COMMIT TRAN;
END TRY
BEGIN CATCH
IF (@@TRANCOUNT > 0)
BEGIN
ROLLBACK TRAN;
END;
SET @ErrorMessage = ERROR_MESSAGE();
RAISERROR(@ErrorMessage, 16, 1);
RETURN; -- exit the script
END CATCH;
END;
--------------------------------------------------------------------------------
GO
--ALTER DATABASE [CSVParser] SET RECOVERY SIMPLE;
GO
USE [CSVParser];
GO
---------- BEGIN CLEANUP -----------
IF (OBJECT_ID(N'dbo.GarbageCollect') IS NOT NULL)
BEGIN
PRINT 'Dropping Stored Procedure: dbo.GarbageCollect...';
DROP PROCEDURE dbo.GarbageCollect;
END;
IF (OBJECT_ID(N'dbo.ParseCSV') IS NOT NULL)
BEGIN
PRINT 'Dropping Stored Procedure: dbo.ParseCSV...';
DROP PROCEDURE dbo.ParseCSV;
END;
IF (EXISTS(SELECT * FROM sys.assemblies WHERE [name] = N'CSVParser'))
BEGIN
PRINT 'Dropping Assembly: CSVParser...';
DROP ASSEMBLY [CSVParser];
END;
---------- END CLEANUP -----------
PRINT N'Creating [CSVParser]...';
GO
CREATE ASSEMBLY [CSVParser]
AUTHORIZATION [dbo]
FROM 0x\
4D5A90000300000004000000FFFF0000B80000000000000040000000000000000000000000000000000000000000000000000000000000000000000080000000\
0E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000\
504500004C010300BCFA10570000000000000000E00002210B010B000010000000060000000000008E2E00000020000000400000000000100020000000020000\
040000000000000004000000000000000080000000020000BBD80000030040850000100000100000000010000010000000000000100000000000000000000000\
382E000053000000004000009803000000000000000000000000000000000000006000000C000000002D00001C00000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000200000080000000000000000000000082000004800000000000000000000002E74657874000000\
940E0000002000000010000000020000000000000000000000000000200000602E72737263000000980300000040000000040000001200000000000000000000\
00000000400000402E72656C6F6300000C0000000060000000020000001600000000000000000000000000004000004200000000000000000000000000000000\
702E0000000000004800000002000500B0220000500A000009000000000000000000000000000000502000008000000000000000000000000000000000000000\
0000000000000000000000000000000041B793E22AD12F2EBFBA0A6DDA67A188CA3C256D99F6F303EEEBF3C507AC533E16D84E479B5E2F162686C00EF85674B0\
EFBBCB6C62B69386B04F2B57056B0338AA3F6E1CEA0D3DAB330B5D2BBD8BD89DB9947E68491E31C2B1E0A7D7B36969899767D41FE8EF805DA2F6B908ED9403FA\
29B9E5BC38D8AF92F657375525AB884A1B300200BF000000010000110F00281000000A2C0717281100000A2A0F02281000000A2D3E0F02281200000A6F130000\
0A7E1400000A6F1500000A2D260F02281200000A731600000A0A060F00281200000A2802000006DE6B062C06066F1700000ADC0F01281000000A2D180F012812\
00000A6F1300000A7E1400000A6F1500000A2C0716281100000A2A0F01281200000A731800000A0B07731900000A0C080F00281200000A2802000006DE0A082C\
06086F1700000ADCDE0A072C06076F1700000ADC16281100000A2A000128000002003E000F4D000A00000000020093000FA2000A0000000002008C0022AE000A\
0000000013300500CF00000002000011160A140B160C02178D15000001130711071603A211076F1A00000A02176F1B00000A3892000000026F1C00000A0D062D\
55098E690C088D1900000113041613052B2A110411057201000070110517588C1A000001281D00000A1F0C281E00000A731F00000AA211051758130511050832\
D11104732000000A0B282100000A076F2200000A170A07096F2300000A26098E69082F1A098E6913062B0E0711066F2400000A11061758130611060832ED2821\
00000A076F2500000A026F2600000A3963FFFFFF282100000A6F2700000A2A1A282800000A2A1E02282900000A2A000042534A4201000100000000000C000000\
76322E302E35303732370000000005006C00000024030000237E0000900300005004000023537472696E677300000000E00700001C00000023555300FC070000\
1000000023475549440000000C0800004402000023426C6F620000000000000002000001471502000900000000FA253300160000010000001F00000002000000\
0400000005000000290000001000000002000000010000000300000000000A00010000000000060031002A000A00590044000A00620044000E00A8008B000A00\
FD00E20006003A01280106005101280106006E01280106008D0128010600A60128010600BF0128010600DA0128010600F501280106000E022801060027022801\
06005702440243006B02000006009A027A020600BA027A020A00E202E200060019032A00060032032A0006005003460306005D0346030A009F03E2000600AB03\
2A000A00C00338000A00CA03E2000A00D803E2000A00E303E200060045042A0000000000010000000000010001000100100018000000050001000100D0200000\
000096006C000A000100C421000000009100B8001E0004009F22000000009600C30025000600A622000000008618D2002900060000000100D800000002000F01\
000003001B0100000100240100000200D8002900D20029003100D20066003900D20066004100D20066004900D20066005100D20066005900D20066006100D200\
66006900D20066007100D20066007900D20066008100D2006B009100D20071009900D2002900A100D20029001900F8021D0111000303210119000F032701A900\
20032701A90025032B01A9002B032E012100D2006600B1003E032900B900D20066002100D2003301210068034201210076034801210094034D01A900B1035201\
C900B8035801C900D2005C01E100D2006401E900EB036B01F100F4037001E10005047601E1000F047100F10019047001210028041D01F10036042900F9004804\
25000900D200290020007B00180124000B002D002E0023009C012E003300B8012E00730023022E0013008C012E001B009C012E002B00A2012E003B00C7012E00\
43009C012E005B0006022E00630011022E006B001A0244000B00400060007B00180164000B00530039017C01048000000100000000000000010000007600D802\
00000200000000000000000000000100210000000000020000000000000000000000010038000000000008000000000000000000000015007500000000000000\
003C4D6F64756C653E004353565061727365722E646C6C004353565574696C73006D73636F726C69620053797374656D004F626A6563740053797374656D2E44\
6174610053797374656D2E446174612E53716C54797065730053716C496E7433320053716C537472696E67005061727365435356004D6963726F736F66742E56\
697375616C4261736963004D6963726F736F66742E56697375616C42617369632E46696C65494F00546578744669656C64506172736572005061727365537475\
66660047617262616765436F6C6C656374002E63746F720044656C696D69746572004D6963726F736F66742E53716C5365727665722E5365727665720053716C\
466163657441747472696275746500496E707574537472696E670046696C6550617468004353560053797374656D2E5265666C656374696F6E00417373656D62\
6C795469746C6541747472696275746500417373656D626C794465736372697074696F6E41747472696275746500417373656D626C79436F6E66696775726174\
696F6E41747472696275746500417373656D626C79436F6D70616E7941747472696275746500417373656D626C7950726F647563744174747269627574650041\
7373656D626C79436F7079726967687441747472696275746500417373656D626C7954726164656D61726B41747472696275746500417373656D626C7943756C\
7475726541747472696275746500417373656D626C7956657273696F6E41747472696275746500417373656D626C7946696C6556657273696F6E417474726962\
7574650053797374656D2E446961676E6F73746963730044656275676761626C6541747472696275746500446562756767696E674D6F6465730053797374656D\
2E52756E74696D652E436F6D70696C6572536572766963657300436F6D70696C6174696F6E52656C61786174696F6E734174747269627574650052756E74696D\
65436F6D7061746962696C697479417474726962757465004353565061727365720053716C50726F636564757265417474726962757465006765745F49734E75\
6C6C006F705F496D706C69636974006765745F56616C756500537472696E67005472696D00456D70747900457175616C730049446973706F7361626C65004469\
73706F73650053797374656D2E494F00537472696E6752656164657200546578745265616465720053657444656C696D6974657273007365745F486173466965\
6C6473456E636C6F736564496E51756F74657300526561644669656C64730053716C4D6574614461746100496E74333200466F726D6174006765745F4D617800\
53716C4462547970650053716C446174615265636F72640053716C436F6E746578740053716C50697065006765745F506970650053656E64526573756C747353\
746172740053657456616C7565730053657444424E756C6C0053656E64526573756C7473526F77006765745F456E644F66446174610053656E64526573756C74\
73456E6400474300436F6C6C6563740000174600690065006C0064007B0030003A00440033007D0000000000CB70CB94BA6F2C478454C84DA3B55CDD0008B77A\
5C561934E0890A00031109110D110D110D08B03F5F7F11D50A3A0600020112110E030000010320000112010001005408074D617853697A650100000012010001\
005408074D617853697A65FFFFFFFF12010001005408074D617853697A65F4010000042001010E052001011145042001010880A0002400000480000094000000\
0602000000240000525341310004000001000100179540030702B7AAA3C324F40B7D6E3FA4C86131039CF02103D5BEFCECB6EB8738A7103340555BD6806E2224\
48420F9C6DA8EF1E9EB72D12328977819BE03687859DB5F1B577EA021E67C5AB440A86DBAE6AAD68ED0FFA2A55EFA5B8DE0BE377102E55FD2E4E8571EB7F5580\
965F88E5A478C56CB8E3EC7ADDFEF48E1A7054B60401000000032000020500011109080320000E02060E042001020E0520010112610807031211125D12110520\
01011D0E04200101020420001D0E0500020E0E1C0300000A072003010E116D0A062001011D12650400001279052001011271052001081D1C0F0708021271081D\
0E1D126508081D0E0F01000A4353562050617273657200000501000000001501001053716C205175616E74756D204C65617000000E0100094353565061727365\
7200003E010039436F707972696768742028632920323031362053716C205175616E74756D204C6561702E20416C6C207269676874732072657365727665642E\
00000A010005312E302E3000000801000200000000000801000800000000001E01000100540216577261704E6F6E457863657074696F6E5468726F7773010000\
00000000BCFA105700000000020000001C0100001C2D00001C0F000052534453ACA1E182C5F2824DB9145A484AD8672601000000633A5C50686F656E69785072\
6F6A6563745C41727469636C65735C5374616972776179546F53514C434C525C52656C617465645C50617273696E674353565C4353565061727365725C435356\
5061727365725C6F626A5C52656C656173655C4353565061727365722E7064620000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000602E000000000000\
000000007E2E0000002000000000000000000000000000000000000000000000702E000000000000000000000000000000005F436F72446C6C4D61696E006D73\
636F7265652E646C6C0000000000FF25002000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000100100000001800008000000000000000000000000000000100010000003000008000000000000000000000000000000100\
000000004800000058400000400300000000000000000000400334000000560053005F00560045005200530049004F004E005F0049004E0046004F0000000000\
BD04EFFE00000100000001000000000000000100000000003F000000000000000400000002000000000000000000000000000000440000000100560061007200\
460069006C00650049006E0066006F00000000002400040000005400720061006E0073006C006100740069006F006E00000000000000B004A002000001005300\
7400720069006E006700460069006C00650049006E0066006F0000007C020000010030003000300030003000340062003000000044001100010043006F006D00\
700061006E0079004E0061006D00650000000000530071006C0020005100750061006E00740075006D0020004C006500610070000000000040000B0001004600\
69006C0065004400650073006300720069007000740069006F006E00000000004300530056002000500061007200730065007200000000002C00060001004600\
69006C006500560065007200730069006F006E000000000031002E0030002E00300000003C000E00010049006E007400650072006E0061006C004E0061006D00\
650000004300530056005000610072007300650072002E0064006C006C00000098003A0001004C006500670061006C0043006F00700079007200690067006800\
7400000043006F0070007900720069006700680074002000280063002900200032003000310036002000530071006C0020005100750061006E00740075006D00\
20004C006500610070002E00200041006C006C0020007200690067006800740073002000720065007300650072007600650064002E00000044000E0001004F00\
72006900670069006E0061006C00460069006C0065006E0061006D00650000004300530056005000610072007300650072002E0064006C006C00000034000A00\
0100500072006F0064007500630074004E0061006D006500000000004300530056005000610072007300650072000000300006000100500072006F0064007500\
63007400560065007200730069006F006E00000031002E0030002E003000000038000800010041007300730065006D0062006C00790020005600650072007300\
69006F006E00000031002E0030002E0030002E003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
002000000C000000903E000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
WITH PERMISSION_SET = UNSAFE;
GO
PRINT N'Creating [dbo].[ParseCSV]...';
GO
CREATE PROCEDURE [dbo].[ParseCSV]
@Delimiter NVARCHAR(1) = N',',
@InputString NVARCHAR(MAX), -- can't specify default: https://connect.microsoft.com/SQLServer/feedback/details/1565637
@FilePath NVARCHAR(500) = NULL
AS EXTERNAL NAME [CSVParser].[CSVUtils].[ParseCSV];
GO
PRINT N'Creating [dbo].[GarbageCollect]...';
GO
CREATE PROCEDURE [dbo].[GarbageCollect]
AS EXTERNAL NAME [CSVParser].[CSVUtils].[GarbageCollect];
GO
PRINT N'Install completed.';
GO
Comments