SQL Server打印

w1jd8yoj  于 2022-11-28  发布在  SQL Server
关注(0)|答案(5)|浏览(181)

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

tyg4sfes

tyg4sfes1#

PRINT就是严重性为0的RAISERROR。因此,您可以使用。

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
ukdjmx9f

ukdjmx9f2#

如果格式字符串的数量有限,并且能够将它们添加到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
dnph8jn4

dnph8jn43#

自SQL Server 2016起,formatmessageraiserror已被扩展,使它们几乎完全像C的printf函数一样工作。第一个参数(以前必须是一个整数,引用sys.messages中的预定义消息)现在可以是printf样式的格式字符串:

select formatmessage(
    'This is a string %s and this is an integer %i%sand this is a string weirdly padded with spaces <<%7.3s>>%sand this is a hex representation of an integer %x',
    'foo',
    42,
    char(13) + char(10),
    'bar',
    char(13) + char(10),
    1337
);

/* output:
This is a string foo and this is an integer 42
and this is a string weirdly padded with spaces <<    bar>>
and this is a hex representation of an integer 539
*/

虽然throw并不隐式支持这种格式,但是可以将formatmessage与以下构造一起使用:

declare @errorMessage nvarchar(max) = formatmessage(
    'This is a string %s and this is an integer %i%sand this is a string weirdly padded with spaces <<%7.3s>>%sand this is a hex representation of an integer %x',
    'foo',
    42,
    char(13) + char(10),
    'bar',
    char(13) + char(10),
    1337
);

throw 50000, @errorMessage, 1;

/* output:
Msg 50000, Level 16, State 1, Line 21
This is a string foo and this is an integer 42
and this is a string weirdly padded with spaces <<    bar>>
and this is a hex representation of an integer 539
*/
rlcwz9us

rlcwz9us4#

下面是一个使用sql_variant数据类型的简单printf过程。不幸的是,它只适用于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
csga3l58

csga3l585#

如果你想在一个变量中存储一些信息,那么SET应该足够你处理了吧?除非我对这个问题不清楚。

SET @varcharVariable = 'message text';

相关问题