我将sql中的别名值放入一个字符串语句中,并不断生成一个带有replace的新字符串。
但是我必须做很多以这种方式嵌套的“替换”。
string 子句中的 {{name}} 实际上是 sql 子句中的别名
有没有办法定义 sql 和模板子句并使其自动化?
样本:
CREATE TABLE [dbo].[message](
[id] [int] IDENTITY(1,1) NOT NULL,
[name] [nvarchar](50) NULL,
[quantity] [float] NULL,
[delivery] [datetime] NULL,
[status] [tinyint] NULL,
)
INSERT [dbo].[message] ( [name], [quantity], [delivery], [status]) VALUES ( N'Omer', 124, CAST(N'2022-10-18T00:00:00.000' AS DateTime), 0)
INSERT [dbo].[message] ( [name], [quantity], [delivery], [status]) VALUES ( N'Jacob', 548, CAST(N'2022-11-05T00:00:00.000' AS DateTime), 0)
INSERT [dbo].[message] ([name], [quantity], [delivery], [status]) VALUES ( N'Hasan', 56454, CAST(N'2022-08-09T00:00:00.000' AS DateTime), 1)
INSERT [dbo].[message] ( [name], [quantity], [delivery], [status]) VALUES ( N'Hans', 548, CAST(N'2023-11-01T00:00:00.000' AS DateTime), 0)
4 rows affected
select * from message where status=0
ID | 姓名 | 数量 | 送货 | 地位 |
---|---|---|---|---|
1 | 奥马尔 | 124 | 2022-10-18 00:00:00.000 | 0 |
2 | 雅各布 | 548 | 2022-11-05 00:00:00.000 | 0 |
4 | 汉斯 | 548 | 2023-11-01 00:00:00.000 | 0 |
declare @template nvarchar(max)='Hello, {{name}} todays order quantity {{quantity}} this order must be sent by the latest {{delivery}}.'
print @template
select
replace(
replace(
replace(@template
,'{{name}}',name)
,'{{quantity}}',quantity)
,'{{delivery}}',format(delivery,'dd.MM.yyy'))
from message where status=0
(无列名) |
---|
您好,Omer 今天的订单数量 124 此订单必须在 2022 年 10 月 18 日之前发出。 |
您好,Jacob 今天订单数量 548 此订单必须在 2022 年 11 月 5 日之前发出。 |
您好,汉斯今天的订单数量 548 此订单必须在 2023 年 11 月 1 日之前发出。 |
Hello, {{name}} todays order quantity {{quantity}} this order must be sent by the latest {{delivery}}.
declare @template nvarchar(max)='Hello, {{name}} todays order quantity {{quantity}} this order must be sent by the latest {{delivery}}.'
print @template
declare @sqlString nvarchar(max)='select name,quantity,format(delivery,''dd.MM.yyy'') as [delivery] from message where status=0'
print @sqlString
Hello, {{name}} todays order quantity {{quantity}} this order must be sent by the latest {{delivery}}.
select name,quantity,format(delivery,'dd.MM.yyy') as [delivery] from message where status=0
/*
template embed code
*/
字符串格式化最好在应用程序代码表示层而不是 T-SQL 中完成。让数据库负担此类任务会限制可伸缩性并影响性能。
看来您尝试小提琴的目标不仅是避免嵌套
REPLACE
函数,而且是一种通用技术,可以使用查询中的列名来指示模板中要替换的值(即嗅探列名)。T-SQL 递归技术将避免嵌套
REPLACE
函数,但性能会更差。下面的示例使用递归 CTE 和 JSON(而不是您小提琴中的 XML)。我敢肯定这里有改进的余地,但它确实有效。