gpt4 book ai didi

sql-server - SQL Server 和 IN 子句中大范围值的效率

转载 作者:行者123 更新时间:2023-12-03 16:30:28 25 4
gpt4 key购买 nike

我有一个类似于 this MySQL question 的案例关于 IN 子句,但对于 SQL Server。

具体来说,我正在构建一个可执行的 SQL 字符串,其中可能包含用于 IN 子句(即 1000+)的非常长的枚举项列表。

这是从动态条件列表构建过滤器的有效方法,还是我应该将条件数据插入临时表,然后将其JOIN 到我的导出表以进行过滤操作?

如果答案不是很直接,我们将不胜感激每种方法的优缺点。

如果有人问这个问题,我深表歉意。链接的 MySQL 问题相当陈旧。我想这是 SQL Server 的副本,但我找不到它。

最佳答案

您忘记告诉我们您使用的 SQL Server 版本。当然,对于每个新版本,我们都获得了帮助我们以更有效的方式解决问题的功能。

在 SQL Server 2005+ 中,您可以使用像这样的简单表值函数来实现连接:

CREATE FUNCTION [dbo].[SplitInts]
(
@List VARCHAR(MAX),
@Delimiter CHAR(1)
)
RETURNS TABLE
AS
RETURN ( SELECT Item FROM ( SELECT Item = x.i.value('(./text())[1]', 'int') FROM
( SELECT [XML] = CONVERT(XML, '<i>' + REPLACE(@List, @Delimiter, '</i><i>')
+ '</i>').query('.') ) AS a CROSS APPLY [XML].nodes('i') AS x(i)
) AS y WHERE Item IS NOT NULL
);
GO

现在传入你的大名单并加入:

CREATE PROCEDURE dbo.GetData
@List VARCHAR(MAX)
AS
BEGIN
SET NOCOUNT ON;

SELECT t.col1, t.col2 --, ...
FROM dbo.DataTable AS t
INNER JOIN dbo.SplitInts(@List, ',') AS i
ON t.ColumnID = i.Item;
END
GO

这不是很好(我 blogged about performance of various methods here 和低于 5000 的值几乎没有区别),但可能比临时 IN (...huge list...) 表现得更好查询。

在 SQL Server 2008+ 中,您可以使用表值参数。与上面类似,您可以将 DataTable 或 C# 中的任何结构传递到存储过程中并执行连接。如果您使用的是 2008 或更高版本,我也可以为此添加一个示例。

关于sql-server - SQL Server 和 IN 子句中大范围值的效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9623178/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com