下面是我当前的SQL。
Insert into [dbo].[XYZ]
select col1,col2,
(select colValue from parsedData([ParameterizedValue]) where [Name] = 'Some Value') AS col3,
(select colValue from parsedData([ParameterizedValue]) where [Name] = 'Some Value') AS col4,
(select colValue from parsedData([ParameterizedValue]) where [Name] = 'Some Value') AS col5 from [dbo].[ABC]
此语句重复调用parsedData
函数。表 ABC 有数百万条记录。
那么是否有任何 SQL 来保存parsedData
的结果,因此只调用一次parsedData
,而不是多次调用。
您可以执行交叉应用(或外部应用(。
交叉应用是相关子查询的替代方法,也可用于"联接函数"。我手边没有一个好的例子,但这里有一些希望有用的链接:
- https://blog.sqlauthority.com/2016/09/23/sql-server-join-table-valued-function-database-table/
- https://www.sqlshack.com/the-difference-between-cross-apply-and-outer-apply-in-sql-server/
- 现实生活中的例子,什么时候在SQL中使用外部/交叉应用
你可以做:
Insert into [dbo].[XYZ]
select abc.col1, abc.col2, p.col3, p.col4, p.col5
from [dbo].ABC abc outer apply
(select max(case when name = 'value1' then colvalue end) as col3,
max(case when name = 'value2' then colvalue end) as col4,
max(case when name = 'value3' then colvalue end) as col5
from parsedData(abc.ParameterizedValue) p
) p;
这应该可以节省对相同数据的多次解析。