/* *** 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