问:我需要在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。
答案 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)
问题的解决方案很少:
结合其中任何一个,您就可以与要提取的数据进行常规连接。