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
Ответы
Ответ 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';