这到底是什么dbo.func()
吗?是否有可能将100个值插入到表结构中,并且一次对100个集合执行该操作,而不是1x1 100次?
举个例子,假设你有这样的功能,只是把一个逗号分隔的浮点值列表变为单列表:
CREATE FUNCTION dbo.ListFloats
(
@List VARCHAR(MAX)
)
RETURNS TABLE
RETURN
(
SELECT i = CONVERT(FLOAT, Item)
FROM
(
SELECT Item = x.i.value('(./text())[1]', 'FLOAT')
FROM
(
SELECT [XML] = CONVERT(XML, '<i>'
+ REPLACE(@List, ',', '</i><i>')
+ '</i>').query('.')
) AS a
CROSS APPLY
[XML].nodes('i') AS x(i)
) AS y
WHERE Item IS NOT NULL
);
GO
现在你应该能得到您的花车在一组只是简单地说:
SELECT i FROM dbo.ListFloats('1.5, 3.0, 2.45, 1.9');
采取更进了一步,让我们说dbo.func()
需要这两个输入,说是这样的:
RETURN (SELECT (@param1 + @param2/@param2));
现在,我知道你总是被告知模块化和封装是好的,但是在内联函数的情况下,我建议你避免获得这个结果的函数(同样你没有解释什么是dbo.func()
,所以我只是猜测这会很容易),并进行内联。因此,而不是调用dbo.func()
的 - 两次,每次行,没少 - 你可以说:
DECLARE
@Param1Array VARCHAR(MAX) = '1.5, 3.0, 2.45, 1.9',
@Param2 FLOAT = 2.0;
WITH x AS
(
SELECT t.point, x.i, fValue = ((x.i + t.point)/t.point)
FROM dbo.[table] AS t
CROSS JOIN dbo.ListFloats(@Param1Array) AS x
)
SELECT point, i, fValue FROM x
--WHERE fValue < @Param2
;
的关键是:
避免单独处理每个参数。
避免在单独的模块中关闭个别计算。
尽可能少地执行计算。
如果你不能改变结构这么多,那么最起码,避免计算功能两次通过写来代替:
;WITH x AS
(
SELECT *, dbo.func(@param1, a.point) as fValue
FROM dbo.table AS a
)
SELECT * FROM x
WHERE fValue < @param2;
如果你提供有关数据类型的详细信息,有什么dbo.func()
呢,等等,人们将能够提供更多切实的建议。
谢谢!这正是我需要的! –