SQL插值字符串

10 sql t-sql string interpolation

T-SQL是否支持插值字符串?

我们举个例子:

SET @query = 'SELECT ' + @somevariable + ' FROM SOME_TABLE'
Run Code Online (Sandbox Code Playgroud)

我希望能够做到这样的事情:

SET @query = 'SELECT {@somevariable} FROM SOME_TABLE'
Run Code Online (Sandbox Code Playgroud)

谢谢你的回答!

小智 13

感谢@jfsebastian 指出这些解决方案。遗憾的是 xp_sprintf 被限制为 254 个字符,因此在使用长查询时这并不理想。FORMATMESSAGE 被限制为 2047 个字符,所以这足以运行长查询。

我将在一篇文章中总结解决方案的所有内容,以使事情井井有条。

答案 1:

使用FORMATMESSAGE重要的是要知道,使用内插字符串作为第一个参数,它仅支持 SQL 版本 2012 及更高版本,因此我将使用 FORMATMESSAGE 发布 2 个答案:

SQL 版本 >= 2012:

SET @query = FORMATMESSAGE('SELECT %s FROM SOME_TABLE', @somevariable);
Run Code Online (Sandbox Code Playgroud)


SQL 版本 < 2012:

EXEC sp_addmessage 50001, 16, 'SELECT %s FROM SOME_TABLE', NULL, NULL, 'replace'
SET @query = FORMATMESSAGE(50001, @somevariable)
Run Code Online (Sandbox Code Playgroud)


答案 2:

使用xp_sprintf存储过程很重要,要注意它限制为 254 个字符,因此对于长查询来说不是一个好主意。

DECLARE  @query AS VARCHAR(100)
        ,@somevariable as VARCHAR(10) = '[id]'
EXEC xp_sprintf @query OUTPUT, 'SELECT %s FROM SOME_TABLE', @somevariable
Run Code Online (Sandbox Code Playgroud)


Ror*_*ory 8

当你的字符串很长时,为了提高可读性,我喜欢这样做:

SET @query = replace( replace( replace( 
               'SELECT {@variable1} FROM {@variable2} WHERE {@variable3}'
               , '{@variable1}', @variable1 )
               , '{@variable2}', @variable2 )
               , '{@variable3}', @variable3 )
Run Code Online (Sandbox Code Playgroud)

它的优点是 SQL 字符串的可读性,而且您可以多次使用同一个变量。显然这不是正确的插值,但我比这个FORMATMESSAGE()选项更喜欢它,因为

  • 它没有长度限制。谁会编写少于 2047 个字符的查询?!;)
  • 它支持命名占位符而不仅仅是有序占位符
  • 任何版本的 SQL Server 都支持
  • 您可以多次使用同一个占位符


j.f*_*ian 6

这不是在T-SQL中做事的常用方法,但可以使用xp_sprintf

    DECLARE  @query AS VARCHAR(100)
            ,@somevariable as VARCHAR(10) = '[id]'
    EXEC xp_sprintf @query OUTPUT, 'SELECT %s FROM SOME_TABLE', @somevariable

    PRINT @query
Run Code Online (Sandbox Code Playgroud)