String.Format类似于T-SQL中的功能?

83 t-sql string

我正在寻找T-SQL中的内置函数/扩展函数,用于字符串操作,类似于String.Format.NET中的方法.

g2s*_*ver 65

如果您使用的是SQL Server 2012及更高版本,则可以使用FORMATMESSAGE.例如.

DECLARE @s NVARCHAR(50) = 'World';
DECLARE @d INT = 123;
SELECT FORMATMESSAGE('Hello %s, %d', @s, @d)
-- RETURNS 'Hello World, 123'
Run Code Online (Sandbox Code Playgroud)

来自MSDN的更多示例:FORMATMESSAGE

SELECT FORMATMESSAGE('Signed int %i, %d %i, %d, %+i, %+d, %+i, %+d', 5, -5, 50, -50, -11, -11, 11, 11);
SELECT FORMATMESSAGE('Signed int with leading zero %020i', 5);
SELECT FORMATMESSAGE('Signed int with leading zero 0 %020i', -55);
SELECT FORMATMESSAGE('Unsigned int %u, %u', 50, -50);
SELECT FORMATMESSAGE('Unsigned octal %o, %o', 50, -50);
SELECT FORMATMESSAGE('Unsigned hexadecimal %x, %X, %X, %X, %x', 11, 11, -11, 50, -50);
SELECT FORMATMESSAGE('Unsigned octal with prefix: %#o, %#o', 50, -50);
SELECT FORMATMESSAGE('Unsigned hexadecimal with prefix: %#x, %#X, %#X, %X, %x', 11, 11, -11, 50, -50);
SELECT FORMATMESSAGE('Hello %s!', 'TEST');
SELECT FORMATMESSAGE('Hello %20s!', 'TEST');
SELECT FORMATMESSAGE('Hello %-20s!', 'TEST');
SELECT FORMATMESSAGE('Hello %20s!', 'TEST');
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 2012年无证
  • 限制为2044个字符
  • 要转义%符号,您需要加倍它.
  • 如果您在扩展事件中记录错误,则调用将FORMATMESSAGE显示为(无害)错误

  • @bijayk它只接受特定的占位符名称,例如,%s代表字符串,%i代表整数. (3认同)
  • @lostmylogin T-SQL 中没有`string.Format` 风格的功能,这是你能得到的最接近的功能。 (2认同)

Jos*_*osh 53

看看xp_sprintf.以下示例.

DECLARE @ret_string varchar (255)
EXEC xp_sprintf @ret_string OUTPUT, 
    'INSERT INTO %s VALUES (%s, %s)', 'table1', '1', '2'
PRINT @ret_string
Run Code Online (Sandbox Code Playgroud)

结果如下所示:

INSERT INTO table1 VALUES (1, 2)
Run Code Online (Sandbox Code Playgroud)

刚刚发现字符串的max size(255 char limit)问题,所以你可以使用另一种函数:

create function dbo.fnSprintf (@s varchar(MAX), 
                @params varchar(MAX), @separator char(1) = ',')
returns varchar(MAX)
as
begin
declare @p varchar(MAX)
declare @paramlen int

set @params = @params + @separator
set @paramlen = len(@params)
while not @params = ''
begin
    set @p = left(@params+@separator, charindex(@separator, @params)-1)
    set @s = STUFF(@s, charindex('%s', @s), 2, @p)
    set @params = substring(@params, len(@p)+2, @paramlen)
end
return @s
end
Run Code Online (Sandbox Code Playgroud)

要获得与上面相同的结果,请按以下方式调用该函数:

print dbo.fnSprintf('INSERT INTO %s VALUES (%s, %s)', 'table1,1,2', default)
Run Code Online (Sandbox Code Playgroud)

  • 只是一个FYI,如果你的任何一个参数包含一个逗号,那么你运气不好.如果你碰巧偶然通过一个,你会遇到一些麻烦,弄清楚出了什么问题. (7认同)

小智 15

我创建了一个用户定义的函数来模仿string.format功能.你可以使用它.

的StringFormat功能于SQL


Joe*_*orn 3

原始 t-sql 仅限于用于字符串操作的 CHARINDEX()、PATINDEX()、REPLACE() 和 SUBSTRING()。但使用 sql server 2005 及更高版本,您可以设置在 .Net 中运行的用户定义函数,这意味着设置 string.format() UDF 应该不会太困难。