IoanPopovici
1/14/2019 - 3:40 PM

ufn_CIDRFromIPMask

Gets the CIDR ('/') from a IP Subnet Mask.

/*
.SYNOPSIS
    Gets the CIDR from a IP Subnet Mask.
.DESCRIPTION
    Gets the CIDR ('/') from a IP Subnet Mask.
.PARAMETER IPSubnetMask
    Specifies the IP subnet mask.
.EXAMPLE
    SELECT dbo.ufn_CIDRFromIPMask('255.255.255.0')
.NOTES
    Created by Ioan Popovici (2018-12-11)
    Credit to Chris O'Connor
    Replace the <CM_Your_Site_Code> with your CM or custom database name.
    Run the code in SQL Server Management Studio.
.LINK
    https://clouddeveloper.space/2015/07/14/sql-inet_aton-ip-address-cidr/ (Chris o'Connor)
.LINK
    https://SCCM.Zone
.LINK
    https://SCCM.Zone/Issues
*/

/*##=============================================*/
/*## QUERY BODY                                  */
/*##=============================================*/
/* #region QueryBody */

USE [<CM_Your_Site_Code/Custom_Function_Database>]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO

IF EXISTS (
    SELECT [OBJECT_ID]
    FROM   [SYS].[OBJECTS]
    WHERE  NAME = 'ufn_CIDRFromIPMask'
)
    DROP FUNCTION [dbo].[ufn_CIDRFromIPMask];
GO

CREATE FUNCTION [dbo].[ufn_CIDRFromIPMask] (
    @IPSubnetMask VARCHAR(15)
)
RETURNS VARCHAR(4)
AS
    BEGIN

        /* Variable declaration */
        DECLARE @IPSubnetMaskToInteger AS BIGINT;
        DECLARE @IPDefaultSubnetMaskToInteger AS BIGINT;
        DECLARE @MaskCalc AS BIGINT;
        DECLARE @LogarithmCacl AS INT;
        DECLARE @Result AS VARCHAR(4);

        /* Convert IP subnet mask to integer */
        SET @IPSubnetMaskToInteger        = (
            CONVERT(BIGINT, PARSENAME(@IPSubnetMask,1)) +
            CONVERT(BIGINT, PARSENAME(@IPSubnetMask,2)) * 256 +
            CONVERT(BIGINT, PARSENAME(@IPSubnetMask,3)) * 65536 +
            CONVERT(BIGINT, PARSENAME(@IPSubnetMask,4)) * 16777216
        );

        /* Convert default IP subnet mask (255.255.255.255) to integer */
        SET @IPDefaultSubnetMaskToInteger = (
            CONVERT(BIGINT, 255) +
            CONVERT(BIGINT, 255) * 256 +
            CONVERT(BIGINT, 255) * 65536 +
            CONVERT(BIGINT, 255) * 16777216
        );

        /* Calculate mask */
        SET @MaskCalc                     = (@IPDefaultSubnetMaskToInteger - @IPSubnetMaskToInteger + 1);
        SET @LogarithmCacl                = (32 - LOG (@MaskCalc, 2));

        /* Calculate result */
        SET @Result = '/' + CAST(@LogarithmCacl AS VARCHAR(5));

        /* Return result */
        RETURN  @Result;
    END;
GO

/* Grants select rights for this function to SCCM reporting users */
GRANT SELECT ON OBJECT::dbo.ufn_CIDRFromIPMask
    TO smsschm_users;

/* #endregion */
/*##=============================================*/
/*## END QUERY BODY                              */
/*##=============================================*/