小编典典

SQL Server查询的最大大小?IN子句?有没有更好的方法

sql

SQL Server查询的最大大小是多少?(字符数)

IN子句的最大大小?我想我看到关于Oracle的项目限制为1000的一些信息,但是您可以将ANDing 2 IN一起解决。SQL
Server中是否存在类似问题?

更新 因此,如果我需要从另一个系统(非关系数据库)中获取1000个GUID,并针对SQL
Server进行“代码中的JOIN”操作,那将是最好的方法呢?是否要将1000个GUID列表提交给IN子句?还是还有另一种更有效的技术?

我还没有测试过,但是我想知道是否可以将GUID提交为XML文档。例如

<guids>
    <guid>809674df-1c22-46eb-bf9a-33dc78beb44a</guid>
    <guid>257f537f-9c6b-4f14-a90c-ee613b4287f3</guid>
</guids>

然后针对Doc和Table进行某种XQuery JOIN。效率低于1000个项目的IN子句?


阅读 184

收藏
2021-05-05

共1个答案

小编典典

每个SQL批处理都必须符合“批处理大小限制”:65,536 *网络数据包大小。

除此之外,您的查询还受运行时条件的限制。它通常会用完堆栈大小,因为x IN(a,b,c)除了x = a OR x = b OR x =
c之外什么都不是,这会创建类似于x = a OR(x = b OR(x = c)),因此使用大量OR会变得很深。SQL
7在IN中的SO值大约为1万,但是如今堆栈更深(由于x64),因此它可以变得更深。

更新

您已经找到Erland的文章,主题为将列表/数组传递到SQL Server。在SQL
2008中,您还具有表值参数,该使您可以将整个DataTable作为单个表类型参数进行传递并在其上进行联接。

XML和XPath是另一个可行的解决方案:

SELECT ...
FROM Table
JOIN (
   SELECT x.value(N'.',N'uniqueidentifier') as guid
   FROM @values.nodes(N'/guids/guid') t(x)) as guids
 ON Table.guid = guids.guid;
2021-05-05