String.Format like functionality in T-SQL?

后端 未结 13 1970
滥情空心
滥情空心 2020-12-02 12:54

I\'m looking for a built-in function/extended function in T-SQL for string manipulation similar to the String.Format method in .NET.

13条回答
  •  無奈伤痛
    2020-12-02 13:37

    Here is my version. Can be extended to accommodate more number of parameters and can extend formatting based on type. Currently only date and datetime types are formatted.

    Example:

    select dbo.FormatString('some string %s some int %s date %s','"abcd"',100,cast(getdate() as date),DEFAULT,DEFAULT)
    select dbo.FormatString('some string %s some int %s date time %s','"abcd"',100,getdate(),DEFAULT,DEFAULT)
    

    Output:

    some string "abcd" some int 100 date 29-Apr-2017
    some string "abcd" some int 100 date time 29-Apr-2017 19:40
    

    Functions:

    create function dbo.FormatValue(@param sql_variant)
    returns nvarchar(100)
    begin
    /*
    Tejasvi Hegde, 29-April-2017
    Can extend formatting here.
    */
        declare @result nvarchar(100)
    
        if (SQL_VARIANT_PROPERTY(@param,'BaseType') in ('date'))
        begin
           select @result = REPLACE(CONVERT(CHAR(11), @param, 106), ' ', '-')
        end
        else  if (SQL_VARIANT_PROPERTY(@param,'BaseType') in ('datetime','datetime2'))
        begin
           select @result = REPLACE(CONVERT(CHAR(11), @param, 106), ' ', '-')+' '+CONVERT(VARCHAR(5),@param,108)
        end
        else
        begin
           select @result = cast(@param as nvarchar(100))
        end
        return @result
    
    /*
    BaseType:
    bigint
    binary
    char
    date
    datetime
    datetime2
    datetimeoffset
    decimal
    float
    int
    money
    nchar
    numeric
    nvarchar
    real
    smalldatetime
    smallint
    smallmoney
    time
    tinyint
    uniqueidentifier
    varbinary
    varchar
    */   
    
    end;
    
    
    create function dbo.FormatString(
        @format nvarchar(4000)
        ,@param1 sql_variant = null
        ,@param2 sql_variant = null
        ,@param3 sql_variant = null
        ,@param4 sql_variant = null
        ,@param5 sql_variant = null
        )
    returns nvarchar(4000)
    begin
    /*
    Tejasvi Hegde, 29-April-2017
    
    select dbo.FormatString('some string value %s some int %s date %s','"abcd"',100,cast(getdate() as date),DEFAULT,DEFAULT)
    select dbo.FormatString('some string value %s some int %s date time %s','"abcd"',100,getdate(),DEFAULT,DEFAULT)
    */
    
        declare @result nvarchar(4000)
    
        select @param1 = dbo.formatValue(@param1)
        ,@param2 = dbo.formatValue(@param2)
        ,@param3 = dbo.formatValue(@param3)
        ,@param4 = dbo.formatValue(@param4)
        ,@param5 = dbo.formatValue(@param5)
    
        select @param2 = cast(@param2 as nvarchar)
        EXEC xp_sprintf @result OUTPUT,@format , @param1, @param2, @param3, @param4, @param5
    
        return @result
    
    end;
    

提交回复
热议问题