String.Format like functionality in T-SQL?

后端 未结 13 1885
滥情空心
滥情空心 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:13

    There is a way, but it has its limitations. You can use the FORMATMESSAGE() function. It allows you to format a string using formatting similar to the printf() function in C.

    However, the biggest limitation is that it will only work with messages in the sys.messages table. Here's an article about it: microsoft_library_ms186788

    It's kind of a shame there isn't an easier way to do this, because there are times when you want to format a string/varchar in the database. Hopefully you are only looking to format a string in a standard way and can use the sys.messages table.

    Coincidentally, you could also use the RAISERROR() function with a very low severity, the documentation for raiseerror even mentions doing this, but the results are only printed. So you wouldn't be able to do anything with the resulting value (from what I understand).

    Good luck!

    0 讨论(0)
  • 2020-12-02 13:13

    Not exactly, but I would check out some of the articles on string handling (amongst other things) by "Phil Factor" (geddit?) on Simple Talk.

    0 讨论(0)
  • 2020-12-02 13:15

    Actually there is no built in function similar to string.Format function of .NET is available in SQL server.

    There is a function FORMATMESSAGE() in SQL server but it mimics to printf() function of C not string.Format function of .NET.

    SELECT FORMATMESSAGE('This is the %s and this is the %s.', 'first variable', 'second variable') AS Result
    
    0 讨论(0)
  • 2020-12-02 13:20

    Raw t-sql is limited to CHARINDEX(), PATINDEX(), REPLACE(), and SUBSTRING() for string manipulation. But with sql server 2005 and later you can set up user defined functions that run in .Net, which means setting up a string.format() UDF shouldn't be too tough.

    0 讨论(0)
  • 2020-12-02 13:20

    One more idea.

    Although this is not a universal solution - it is simple and works, at least for me :)

    For one placeholder {0}:

    create function dbo.Format1
    (
        @String  nvarchar(4000),
        @Param0  sql_variant
    )
    returns nvarchar(4000)
    as
    begin
        declare @Null nvarchar(4) = N'NULL';
    
        return replace(@String, N'{0}', cast(isnull(@Param0, @Null) as nvarchar(4000)));    
    end
    

    For two placeholders {0} and {1}:

    create function dbo.Format2
    (
        @String  nvarchar(4000),
        @Param0  sql_variant,
        @Param1  sql_variant
    )
    returns nvarchar(4000)
    as
    begin
        declare @Null nvarchar(4) = N'NULL';
    
        set @String = replace(@String, N'{0}', cast(isnull(@Param0, @Null) as nvarchar(4000)));
           return     replace(@String, N'{1}', cast(isnull(@Param1, @Null) as nvarchar(4000))); 
    end
    

    For three placeholders {0}, {1} and {2}:

    create function dbo.Format3
    (
        @String  nvarchar(4000),
        @Param0  sql_variant,
        @Param1  sql_variant,
        @Param2  sql_variant
    )
    returns nvarchar(4000)
    as
    begin
        declare @Null nvarchar(4) = N'NULL';
    
        set @String = replace(@String, N'{0}', cast(isnull(@Param0, @Null) as nvarchar(4000)));
        set @String = replace(@String, N'{1}', cast(isnull(@Param1, @Null) as nvarchar(4000))); 
           return     replace(@String, N'{2}', cast(isnull(@Param2, @Null) as nvarchar(4000)));
    end
    

    and so on...

    Such an approach allows us to use these functions in SELECT statement and with parameters of nvarchar, number, bit and datetime datatypes.

    For example:

    declare @Param0 nvarchar(10) = N'IPSUM' ,
            @Param1 int          = 1234567  ,
            @Param2 datetime2(0) = getdate();
    
    select dbo.Format3(N'Lorem {0} dolor, {1} elit at {2}', @Param0, @Param1, @Param2);  
    
    0 讨论(0)
  • 2020-12-02 13:26

    I think there is small correction while calculating end position.

    Here is correct function

    **>>**IF OBJECT_ID( N'[dbo].[FormatString]', 'FN' ) IS NOT NULL
    DROP FUNCTION [dbo].[FormatString]
    GO
    /***************************************************
    Object Name : FormatString
    Purpose : Returns the formatted string.
    Original Author : Karthik D V http://stringformat-in-sql.blogspot.com/
    Sample Call:
    SELECT dbo.FormatString ( N'Format {0} {1} {2} {0}', N'1,2,3' )
    *******************************************/
    CREATE FUNCTION [dbo].[FormatString](
        @Format NVARCHAR(4000) ,
        @Parameters NVARCHAR(4000)
    )
    RETURNS NVARCHAR(4000)
    AS
    BEGIN
        --DECLARE @Format NVARCHAR(4000), @Parameters NVARCHAR(4000) select @format='{0}{1}', @Parameters='hello,world'
        DECLARE @Message NVARCHAR(400), @Delimiter CHAR(1)
        DECLARE @ParamTable TABLE ( ID INT IDENTITY(0,1), Parameter VARCHAR(1000) )
        Declare @startPos int, @endPos int
        SELECT @Message = @Format, @Delimiter = ','**>>**
    
        --handle first parameter
         set @endPos=CHARINDEX(@Delimiter,@Parameters)
        if (@endPos=0 and @Parameters is not null) --there is only one parameter
            insert into @ParamTable (Parameter) values(@Parameters)
        else begin
            insert into @ParamTable (Parameter) select substring(@Parameters,0,@endPos)
        end
    
        while @endPos>0
        Begin
            --insert a row for each parameter in the 
            set @startPos = @endPos + LEN(@Delimiter)
            set @endPos = CHARINDEX(@Delimiter,@Parameters, @startPos)
            if (@endPos>0)
                insert into @ParamTable (Parameter) 
                    select substring(@Parameters,@startPos,@endPos - @startPos)
                else
                    insert into @ParamTable (Parameter) 
                    select substring(@Parameters,@startPos,4000)            
        End
    
        UPDATE @ParamTable SET @Message = 
            REPLACE ( @Message, '{'+CONVERT(VARCHAR,ID) + '}', Parameter )
        RETURN @Message
    END
    Go
    grant execute,references on dbo.formatString to public 
    
    0 讨论(0)
提交回复
热议问题