Вот простая процедура printf с использованием типов данных sql_variant. К сожалению, это работает только для SQL Server 2008 и выше.
CREATE PROCEDURE dbo.printf
@string nvarchar(max),
@p1 sql_variant = null,
@p2 sql_variant = null,
@p3 sql_variant = null
AS
BEGIN
declare @str nvarchar(200), @pos int, @type char(1)
select @str = @string, @pos = 0
--- @p1
set @pos = CHARINDEX('%', @str, @pos)
if @pos > 0 and substring(@str, @pos, 2) = '%%'
set @str = stuff(@str, @pos, 2, coalesce(cast(@p1 as nvarchar(100)),'<null>'))
--- @p2
set @pos = CHARINDEX('%', @str, @pos)
if @pos > 0 and substring(@str, @pos, 2) = '%%'
set @str = stuff(@str, @pos, 2, coalesce(cast(@p2 as nvarchar(100)),'<null>'))
--- @p3
set @pos = CHARINDEX('%', @str, @pos)
if @pos > 0 and substring(@str, @pos, 2) = '%%'
set @str = stuff(@str, @pos, 2, coalesce(cast(@p3 as nvarchar(100)),'<null>'))
print @str
END
А вот примеры вызовов:
exec dbo.printf 'Hello %%', 'World'
exec dbo.printf 'Hello %%. Today is %% of the month', 'World', 28
declare @dd datetime; set @dd = getDate()
exec dbo.printf 'Hello %%. Today''s date is %%', 'World', @dd