SQLCommand ExecuteNonQuery Maximum CommandText Longueur?
J'ai cherché autour de l'internet et tout semble être sur les champs de l'individu ou de faire un insert. J'ai un outil de migration qui est la migration d'un ancien héritage de la base de données (superbase) à notre DB SQL server (2008). Actuellement, je suis en train de lire 20 000 enregistrements à partir de l'ancienne base de données et de générer un grand SQLCommand.CommandText
chaîne avec 20 000 insérer des déclarations séparées par un point-virgule. Cela fonctionne bien. Mais puis-je faire 25k? 30k? J'ai essayé de ne pas avoir de limite à tout, mais quand j'ai essayé d'exécuter ExecuteNonQuery
avec un CommandText
contenant plus de 4 millions d'INSÉRER des déclarations, il a dit quelque chose à propos d'être trop long. Je ne me souviens plus du message d'erreur exact, désolé. Je ne trouve pas de documentation sur l'exacte des limites. Il est important pour moi de savoir parce que le plus insère je peut mettre le feu à un moment, le plus rapide de l'ensemble du processus. Tous les conseils /liens /documents serait grandement apprécié, merci!
int.MaxValue
.. vous serez à court de mémoire avant de frapper) et la valeur maximale admissible de taille de requête de SQL...quelle qu'elle soit.Je pensais, comme beaucoup, mais de trouver le réel max taille de requête est là que je vais avoir de la difficulté à
Je crois qu'il est de 64 ko * la taille des paquets. Cependant au lieu de 20 000 instructions insert, avez-vous envisagé (a) décomposer en petits lots (b) en utilisant les VALEURS de() à la décomposer en, disons, 20 états d'INSERTION? (c) à l'aide de SSIS ou un autre outil qui est beaucoup mieux à la génération des opérations en bloc de 20 000 INSERT sera jamais?
Aussi, pourquoi avez-vous besoin de "recall", le message d'erreur exact? Tu ne peux pas reproduire le problème, puis copier et coller le message d'erreur, sans avoir à appeler votre propre mémoire? Non pas que vous devriez jamais envoyer 4 millions d'instructions INSERT dans n'importe quel scénario, indépendamment des problèmes avec les longueurs de chaîne dans la langue de l'application.
Le découper en petits lots a été le problème d'origine. Les insertions qui peut être fait dans un ExecuteNonQuery le plus rapide de la migration. Je peux reproduire le problème, mais il faudrait au moins 15 heures. C'est une longue histoire. L'obtention de données de SuperBase nécessite l'utilisation de leur pilote ODBC qui est très lent. Nous parlons comme 5 minutes pour rassembler 1000 enregistrements en fonction de la requête. Je ne sais pas comment je voudrais utiliser SSIS ou n'importe quel outil depuis cette DB est de 20 ans et n'est pas supporté par quoi que ce soit mais je vais chercher plus loin
OriginalL'auteur DontFretBrett | 2014-01-27
Vous devez vous connecter pour publier un commentaire.
Cela dépend de la version de SQL Server.
http://technet.microsoft.com/en-us/library/ms143432.aspx
Pour SQL Server 2012, la taille de lot ou une Instruction SQL (String) = De 65 536 * taille de paquet Réseau.
Réseau de Paquets de Taille est la taille de l' (tabular data stream) des paquets utilisés pour la communication entre les applications et le Moteur de Base de données relationnelle. La taille de paquet par défaut est de 4 KO, et est contrôlée par la taille de paquet réseau option de configuration.
En bref, 64K x 4K = 256 MO. Encore une fois, cela suppose que vous utilisez par défaut de la taille de paquet.
technet.microsoft.com/en-us/library/ms177437(v=sql.100).aspx Voici comment vous le faites dans SQL Server 2008. Quelle taille avez-vous??
4096. Merci!!!!! Alors maintenant, je dois juste m'assurer que mes CommandText chaîne de 256 mo ou moins. - Il Correct?
Exactement. Merci de me donner le crédit pour la réponse. Bonne programmation!
Je vais tester cela et que, une fois réussie, un plaisir de vous donner de crédit. Je l'apprécie
OriginalL'auteur CRAFTY DBA
Une brève recherche bing m'a montré ce lien: http://dbaspot.com/sqlserver-programming/399616-what-max-length-sqlcommand-commandtext.html
Il dit:
Il est difficile de savoir si cela change pour les différentes versions de sql server.
La droite. Qu'est ce que ce lien renvoie à SQL Server limite. La longueur de la chaîne est mentionné dans ce fil, mais le dernier post (celui que j'ai cité) fait référence à l'instance de SQL Server limite. C'est environ 1/8ème de la taille maximale d'une chaîne de caractères, je pense.
"La taille maximale pour un traitement de requêtes est de 65536 * taille de paquet réseau. Les paquets par défaut est de 4096 octets, ce qui donne une limite supérieure de 268 millions d'octets." Une idée de comment je déterminer la taille de paquet réseau?
Presque droit, 65536/1024 = 64K x 4k = 256 MO
Vous êtes à la fois à droite. 256 MO = environ 268 millions d'octets. De 65 536 x 4096 = 268,435,456. Dire un MO est égal à un million d'octets, c'est comme dire d'un litre est égal à un litre.
OriginalL'auteur Tim