SQL 插值字符串

新手上路,请多包涵

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

让我们举个例子:

 SET @query = 'SELECT ' + @somevariable + ' FROM SOME_TABLE'

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

 SET @query = 'SELECT {@somevariable} FROM SOME_TABLE'

感谢您的回答!

原文由 user7867434 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 718
2 个回答

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

为了使事情井井有条,我将在一篇文章中总结所有解决方案。

答案1:

使用 FORMATMESSAGE 重要的是要知道,首先使用插值字符串作为参数,它仅支持 SQL 版本 2012 及更高版本,所以我将使用 FORMATMESSAGE 发布 2 个答案:

SQL 版本 >= 2012:

 SET @query = FORMATMESSAGE('SELECT %s FROM SOME_TABLE', @somevariable);

SQL 版本 < 2012:

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

答案 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

原文由 user7867434 发布,翻译遵循 CC BY-SA 3.0 许可协议

编写了 2 个方便的基于 Json 的插值函数。一个使用字典样式 Json(键、值对),另一个使用 Json 对象,其中包含每个替换的属性。

1) 数据作为 Json 对象

例如,给定模板: 'Hey, {name} is {age}' ,运行:

 SELECT [res4] = [ccgen].[fn_string_interpolation_object]('Hi, {name} is {age}' ,'{"name":"Alice", "age":24}')

…返回 Hey, Alice is 24

 CREATE OR ALTER FUNCTION [CcGen].[fn_string_interpolation_object](
   @template NVARCHAR(4000), @data_json NVARCHAR(4000)) RETURNS NVARCHAR(4000) AS

   /*
   =============================================
   C# or Java like string interpolation brought to TSQL.

   example - copy to run proc
   -----------------------
   --property names must match those in template. Same as a dynamic object in C#

   SELECT [res4] = [ccgen].[fn_string_interpolation_object]('Hi, {name} is {age}' ,'{"name":"Alice", "age":24}')

   -- returns
   Hi, Alic is 24
   =============================================
   */

BEGIN
   SELECT @template = REPLACE(@template ,'{' + [key] + '}' ,[value]) FROM OPENJSON(@data_json);
   RETURN @template;
END;

2)数据作为Json字典 例如,给定模板: 'Hey, {name} is {age}' ,运行:

 SELECT [res2] = [ccgen].[fn_string_interpolation]('Hey, {name} is {age}','{"items":[{"key":"name", "value":"Alice"},{"key":"age", "value":"24"}]}')

…返回 Hey, Alice is 24

 CREATE OR ALTER FUNCTION [CcGen].[fn_string_interpolation](
   @template NVARCHAR(4000),
   @key_value_json NVARCHAR(4000)) RETURNS NVARCHAR(4000) AS

   /*
   =============================================
   C# or Java like string interpolation brought to TSQL.

   example - copy to run proc
   -----------------------

   DECLARE @json NVARCHAR(2048) = N'{
    "items": [
        {
            "key": "A",
            "value": "a1"
        },
        {
            "key": "B",
            "value": "b2"
        },
        {
            "key": "C",
            "value": "c3"
        }
    ]
}';

   DECLARE @template NVARCHAR(4000) = 'message:= A:{A}, B:{B}, C:{C}'
   select res = ccgen.fn_string_interpolation(@template, @json)

   -- returns
   formatted 3 = A:a1, B:b2, C:c3
   =============================================
   */

BEGIN
   SELECT @template = REPLACE(@template ,'{' + [key] + '}' ,[value]) FROM OPENJSON(@key_value_json ,'$.items') WITH ( [key] VARCHAR(200) '$.key', [value] VARCHAR(4000) '$.value' );
   RETURN @template;
END;

提示:Json 需要更多的输入。修改代码并将属性名称缩短为“k”(键)、“v”(值)和“d”(项目)以使其变小。然后调用更整洁:

 SELECT [res2] = [ccgen].[fn_string_interpolation]('Hey, {name} is {age}','{"d":[{"k":"name", "v":"Alice"},{"k":"age", "v":"24"}]}')


笔记:

当然,这只适用于支持 Json 的 MSSQL 版本。也不支持转义。例如,不可能将 {a} 既作为文字参数又作为替换参数。这可以使用转义添加,但不能保证努力,因为我没有使用该功能。

原文由 Rax 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进