String.Format как функциональность в T-SQL? - PullRequest
81 голосов
/ 02 октября 2008

Я ищу встроенную функцию / расширенную функцию в T-SQL для работы со строками, похожую на метод String.Format в .NET.

Ответы [ 12 ]

0 голосов
/ 23 декабря 2010

вот что я нашел в своих экспериментах с использованием встроенного

Функция FORMATMESSAGE ()

sp_addmessage @msgnum=50001,@severity=1,@msgText='Hello %s you are #%d',@replace='replace'
SELECT FORMATMESSAGE(50001, 'Table1', 5)

когда вы вызываете sp_addmessage, ваш шаблон сообщения сохраняется в системной таблице master.dbo.sysmessages (проверено на SQLServer 2000).

Вы должны сами управлять добавлением и удалением шаблонных строк из таблицы, что неудобно, если все, что вам действительно нужно, это вывести быстрое сообщение на экран результатов.

Решение, предоставленное Kathik DV, выглядит интересно, но не работает с SQL Server 2000, поэтому я немного изменил его, и эта версия должна работать со всеми версиями SQL Server:

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)
        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

Использование:

print dbo.formatString('hello {0}... you are {1}','world,good')
--result: hello world... you are good
0 голосов
/ 02 октября 2008

Не совсем, но я бы ознакомился с некоторыми статьями по обработке строк (среди прочего) от "Phil Factor" (geddit?) На Simple Talk.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...