具有数百万参数的SqlServer中的WHERE IN子句 - C#

时间:2017-01-13 13:59:39

标签: c# sql sql-server

问:我需要在WHERE IN子句中传递数百万个参数,下面是提到的场景:

我有两个数据库服务器SourceDB-server& DestinationDB服务器, 我需要从SourceDB到DestinationDB同步数据,所以我通过C#代码动态生成查询,最终查询如下:

SelectQuery = "SELECT 
[tbltest01details].[testdetailsid],
[tbltest01details].[name],
[tbltest01details].[testid]  
FROM 
    [SourceServer].[SourceDB].[dbo]. [tbltest01details]  with (nolock)    
    WHERE 
    ( 
        [tbltest01details].[testid] 
        IN 
        (1,2,3.,.,.,......,80-million) 
    )"; 

WHERE IN子句可以是GUID或整数。

以上查询将通过以下方法在SourceServer上执行:

GetData(SourceConnectionString, SelectQuery, SourceTimeOut);

我在SourceDB-Server上只有Read-Access,即我只能使用SELECT查询从服务器获取数据。

注意: 有些人可能会建议使用TEMPORARY表,但我无法在SourceDB-Server上创建TEMPORARY表。因为我只在SourceDB-Server上进行READ-Access。

3 个答案:

答案 0 :(得分:1)

你不能。

但您可以在SELECT子句

中使用IN
SELECT * FROM TABLE1 WHERE MYFK IN (SELECT ID FROM TABLE2)

或者......因为你必须处理数百万行,你不能只选择它们然后过滤应用程序代码所需的那些行吗?如果在100M行表中需要80M行,这可能是最简单的方法。如果你的表有80亿行而不是它可能不是一个好方法。

答案 1 :(得分:0)

如果[tbltest01details].[testid]实际上只是您希望查询检查的数值,则可以使用BETWEEN。如果它们是真正独特的非数字参数,那么你实际上没有可行的方法去做你想要完成的事情,你需要重新思考你实际在做什么。

SelectQuery = "SELECT 
[tbltest01details].[testdetailsid],
[tbltest01details].[name],
[tbltest01details].[testid]  
FROM 
[SourceServer].[SourceDB].[dbo]. [tbltest01details]  with (nolock)    
WHERE 
( 
    [tbltest01details].[testid] 
    BETWEEN 1 AND 80000000
)"; 

答案 2 :(得分:0)

问题的解决方案很少:

结合其中任何一个,您就可以与要提取的数据进行常规连接。