WHERE dans la clause dans SqlServer avec des millions de parameters – C #

Q: Je dois passer des millions de parameters dans la clause WHERE IN, ci-dessous le scénario mentionné:

J'ai deux servers de database server SourceDB et server de DestinationDB, j'ai besoin de synchroniser des données de SourceDB TO DestinationDB, ainsi je génère la requête dynamicment par le code de C #, la question finale est mentionnée ci-dessous:

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 Clause peut être GUID OR entier.

La requête ci-dessus sera exécutée sur SourceServer via la méthode ci-dessous:

 GetData(SourceConnectionSsortingng, SelectQuery, SourceTimeOut); 

J'ai seulement Read-Access sur SourceDB-Server, c.-à-d., Je peux seulement utiliser la requête SELECT pour get des données du server.

NOTE: Certains peuvent suggérer d'utiliser la table TEMPORARY, mais je ne peux pas faire de table TEMPORARY sur SourceDB-Server. Parce que j'ai seulement READ-Access sur SourceDB-Server.

Tu ne peux pas.

Mais vous pouvez utiliser un SELECT dans la clause IN

 SELECT * FROM TABLE1 WHERE MYFK IN (SELECT ID FROM TABLE2) 

Ou … puisque vous devez gérer des MILLIONS de lignes, ne pouvez-vous pas les sélectionner toutes, puis filterr celles requirejses par le code de l'application? Si vous avez besoin de 80M lignes dans une table de 100M lignes, cela peut être l'approche la plus simple. Si votre table contient 80 milliards de lignes, ce n'est peut-être pas une bonne approche.

Si [tbltest01details].[testid] est en fait juste une valeur numérique avec laquelle vous voulez vérifier votre requête, vous pouvez utiliser BETWEEN . S'il s'agit de réels parameters non numériques, il n'y a littéralement aucun moyen pratique de faire ce que vous voulez accomplir, et vous devez repenser ce que vous faites réellement.

c'est à dire

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

Peu de solutions à la question posée:

En combinant l'un de ces éléments, vous effectuerez une jointure régulière avec datatables que vous souhaitez extraire.