SQL Server printf - PullRequest
       14

SQL Server printf

13 голосов
/ 28 февраля 2011

Есть ли в Sql Server функция, похожая на printf?Мне нужны те же функции, что и функции RAISERROR, но вместо того, чтобы выдавать ошибку или печатать сообщение, я хочу записать его в varchar , потому что мой ERP не позволяет мне обрабатывать сообщения об ошибках.

Это SQL Server 2000.

Фактический рабочий пример с RAISERROR:

declare @name varchar(10)
set @name = 'George'

RAISERROR ('Hello %s.', 10, 1, 'George')

печать Hello George

Что я ищу:

declare @name varchar(10), @message varchar(50)
set @name = 'George'

SET @message = printf('Hello %s.', 'George')
return @message

Это вернет Hello George

Ответы [ 4 ]

15 голосов
/ 28 февраля 2011

PRINT - это просто RAISERROR со степенью серьезности 0. Таким образом, вы можете использовать.

declare @name varchar(10)
set @name = 'George'

RAISERROR ('Hello %s.', 0, 1, 'George') WITH NOWAIT

Изменить, чтобы сохранить его в переменной, которую вы можете использовать расширенную хранимую процедуру xp_sprintf.

declare @name varchar(10)
set @name = 'George'

DECLARE @ret varchar(500)
exec master..xp_sprintf @ret OUTPUT, 'Hello %s.', @name
PRINT @ret
10 голосов
/ 28 февраля 2011

Если у вас ограниченное количество строк формата и вы можете добавить их в системные сообщения (через sp_addmessage ), вы можете использовать FORMATMESSAGE :

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


Ниже приведен правильный ответ для SQL Server 2005 или более поздней версии, но, к сожалению, OP являетсяищу решение для SQL Server 2000:


Это уродливо, злоупотребление Try / Catch и RAISERROR:

declare @message varchar(50)

begin try
    RAISERROR('Hello %s',16,1,'george')
end try
begin catch
    set @message = ERROR_MESSAGE()
end catch

print @message
0 голосов
/ 28 июля 2016

Вот простая процедура 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
0 голосов
/ 28 февраля 2011

Если вы хотите сохранить какое-либо сообщение в переменной, тогда SET должно быть достаточно для вашей обработки, верно? Если мне не ясен вопрос.

SET @varcharVariable = 'message text';
...