Подтвердить что ты не робот

SQL Server printf

Есть ли функция printf в Sql Server? Я хочу те же функции, что и функция 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

4b9b3361

Ответ 1

Если у вас ограниченное количество строк формата и вы можете добавить их в sysmessages (через 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

Ответ 2

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

Ответ 3

При отсутствии эквивалента printf, и если вы предпочитаете не использовать RAISERROR с серьезностью 0, вы можете использовать то, что я делаю, следующее:

PRINT 'My string is '[email protected]+'.'
PRINT 'My date is '+CONVERT(varchar(16), @myDate, 120)+'.'
PRINT 'My number is '+RTRIM(CAST(@myNumber as varchar(8)))+'.'

Обычно RTRIM() на самом деле не требуется (поскольку varchar() будет выдавать фактическое количество требуемых символов), но я использую его в любом случае, поскольку пользовательский ввод иногда имеет завершающий пробел.

Конкатенации строк являются самыми тривиальными, но все типы могут выводиться таким образом с правильным синтаксисом.

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

Ответ 4

Вот простая процедура 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' date is %%', 'World', @dd

Ответ 5

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

SET @varcharVariable = 'message text';