SqlQuantumLeap icon

SQLCLR SP Parses CSV file to Result Set - Installer

SqlQuantumLeap | PRO | 04/10/22 05:42:27 PM UTC (Edited) | 0 ⭐ | 465 👁️ | Never ⏰ | []
T-SQL |

27.81 KB

|

None

|

0 👍

/

0 👎

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