C# 创建对Id列使用重筛选的查询的最佳方法是什么?

C# 创建对Id列使用重筛选的查询的最佳方法是什么?,c#,sql,sql-server,sql-server-2008,C#,Sql,Sql Server,Sql Server 2008,在我的应用程序中,我将不得不使用许多动态查询,在这些查询中,我只能选择通过Id过滤的某些项目,如: SELECT * FROM Data WHERE Id IN (231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264

在我的应用程序中,我将不得不使用许多动态查询,在这些查询中,我只能选择通过Id过滤的某些项目,如:

SELECT *
FROM Data
WHERE Id IN (231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335)
我确信在中使用
在条款和性能上并不是实现这一点的最佳方式,而且我无法提前知道我可能要检索的ID数量,因此它最终可能会大于
子句中的
中允许的项目数量限制

实现这种过滤的最佳机制是什么

我曾想过使用暂存表插入ID,然后在执行数据查询时使用此表的联接,但我不确定始终在该暂存表中删除和插入的性能,而且ID列表取决于用户,因此,User1可能正在使用ids1-200执行查询,而User2正在同时使用ids201-500执行查询

谢谢

可以使用CTEs吗?像

;WITH filter AS 
(
   SELECT ID FROM Somwhere
)

SELECT * FROM filter 
JOIN data ON filter.id = data.id

--Lets choose now next filter

;WITH filter AS
(
    SELECT Id FROM newCriteria
)
--继续

如果是一组大的ID,也许你有机会声明一些@MinID、@MaxID,然后使用

Where ID Between @MinID AND @MaxID 
祝你度过愉快的一天:)

也许可以使用CTEs?像

;WITH filter AS 
(
   SELECT ID FROM Somwhere
)

SELECT * FROM filter 
JOIN data ON filter.id = data.id

--Lets choose now next filter

;WITH filter AS
(
    SELECT Id FROM newCriteria
)
--继续

如果是一组大的ID,也许你有机会声明一些@MinID、@MaxID,然后使用

Where ID Between @MinID AND @MaxID 
祝你度过愉快的一天:)

也许可以使用CTEs?像

;WITH filter AS 
(
   SELECT ID FROM Somwhere
)

SELECT * FROM filter 
JOIN data ON filter.id = data.id

--Lets choose now next filter

;WITH filter AS
(
    SELECT Id FROM newCriteria
)
--继续

如果是一组大的ID,也许你有机会声明一些@MinID、@MaxID,然后使用

Where ID Between @MinID AND @MaxID 
祝你度过愉快的一天:)

也许可以使用CTEs?像

;WITH filter AS 
(
   SELECT ID FROM Somwhere
)

SELECT * FROM filter 
JOIN data ON filter.id = data.id

--Lets choose now next filter

;WITH filter AS
(
    SELECT Id FROM newCriteria
)
--继续

如果是一组大的ID,也许你有机会声明一些@MinID、@MaxID,然后使用

Where ID Between @MinID AND @MaxID 

祝您愉快:)

如果适用,您可以创建并使用
表值参数。首先,在服务器上定义
用户定义的表类型
,然后在客户端,创建类型为
SqlDbType.Structured的参数
将参数的
TypeName
属性设置为
用户定义的表类型
名称,并使用支持的类型数据之一填充
表值参数


有关更多信息,请参阅
MSDN
文章

如果适用,您可以创建并使用
表值参数
。首先,在服务器上定义
用户定义的表类型
,然后在客户端,创建类型为
SqlDbType.Structured的参数
将参数的
TypeName
属性设置为
用户定义的表类型
名称,并使用支持的类型数据之一填充
表值参数


有关更多信息,请参阅
MSDN
文章

如果适用,您可以创建并使用
表值参数
。首先,在服务器上定义
用户定义的表类型
,然后在客户端,创建类型为
SqlDbType.Structured的参数
将参数的
TypeName
属性设置为
用户定义的表类型
名称,并使用支持的类型数据之一填充
表值参数


有关更多信息,请参阅
MSDN
文章

如果适用,您可以创建并使用
表值参数
。首先,在服务器上定义
用户定义的表类型
,然后在客户端,创建类型为
SqlDbType.Structured的参数
将参数的
TypeName
属性设置为
用户定义的表类型
名称,并使用支持的类型数据之一填充
表值参数


欲了解更多信息,请参阅MSDN的
article

在这些论坛中,提问者通常暗示他正在做类似的事情

query 1
select id 
from table1
where whatever
然后

query 2
select *
from table2
where id in (the list from table 1)
使用同一数据库中的两个表。换句话说,提问者不知道如何连接表

这里可能不是这样,因为@ibiza在最后一段提到了连接表。这意味着不止一个数据库在起作用。如果它们在同一台服务器上,解决这种情况的更好方法是获得适当的权限并使用数据库名称限定表。大概是这样的:

from database1.schemaname.tablename t1 join database2.schemaname.tablename t2
on t1.id = t2.id
但是,这两个数据库可能不在同一台服务器上。如果是这样,我最喜欢的方法就是设置链接服务器。然后使用openquery将数据从远程服务器获取到当前服务器上的临时表中。然后可以加入临时表。我将在存储过程中执行此操作


最后,您可以尝试使用应用程序代码将长列表分解为一系列短列表。然后你在这些较短的列表中循环,一旦你完成了,你就可以组合你的最终结果。然而,这是混乱的,这就是为什么它是最后的手段

通常在这些场合,提问者暗示他正在做这样的事情

query 1
select id 
from table1
where whatever
然后

query 2
select *
from table2
where id in (the list from table 1)
使用同一数据库中的两个表。换句话说,提问者不知道如何连接表

这里可能不是这样,因为@ibiza在最后一段提到了连接表。这意味着不止一个数据库在起作用。如果它们在同一台服务器上,解决这种情况的更好方法是获得适当的权限并使用数据库名称限定表。大概是这样的:

from database1.schemaname.tablename t1 join database2.schemaname.tablename t2
on t1.id = t2.id
但是,这两个数据库可能不在同一台服务器上。如果是这样,我最喜欢的方法就是设置链接服务器。然后使用openquery将数据从远程服务器获取到当前服务器上的临时表中。然后可以加入临时表。我将在存储过程中执行此操作

作为最后手段,您可以尝试使用应用程序代码来打破冗长的列表