Mise à Jour de nombreux (> 3000) des enregistrements avec des données uniques, en utilisant un formulaire web de caractère limité

dba.stackexchange https://dba.stackexchange.com/questions/18094

  •  22-10-2019
  •  | 
  •  

Question

D'accord, comme vous pouvez le dire de la dernière partie du titre, c'est une situation non idéale.

J'utilise un logiciel interface web spécifiques à l'industrie que je vous garantis que personne n'a jamais entendu parler, et alors que la fonctionnalité, il propose de faire la saisie des données de masse est maigre, il ne me permet d'exécuter des requêtes SQL directement sur sa base de données MS SQL sous-jacente via un formulaire web 8000 caractères limité. C'est le plus accès direct, je dois la base de données.

Je dois mettre à jour un domaine particulier dans environ 3 700 dossiers avec des données uniques pour chacun. Comme par cette réponse, je l'ai fait ce qui suit:

UPDATE guest
  SET info4 = CASE guestid
    WHEN 12345 THEN 'BNID: 917546553'
    WHEN 67890 THEN 'BNID: B04695465'
    [etc, etc.]
    ELSE info4
  END

(Le champ info4 est vide actuellement tous les dossiers.) Je peux adapter environ 200 cas dans une requête avant d'atteindre la limite de caractères et d'avoir à lancer une nouvelle mise à jour avec la prochaine partie de données.

Ce que j'ai découvert jusqu'à présent:

  • Non compris la déclaration de ELSE à la fin videra le champ sur tous les dossiers qui ne remplissent pas le cas.
  • Avant de vous engager, je reçois « lignes affectées: [Nombre de lignes dans la table] ». Au lieu du nombre de lignes qui seront effectivement obtenir de nouvelles données

Je comprends que je devrait consacrions WHERE guestid IN (12345, 67890) à la fin pour éviter de la mise à jour sur chaque ligne, mais qui va infernales être pour éviter de courir sur ma limite de caractères à chaque partie de la déclaration de mise à jour.

Comme il arrive, je suis actuellement mes données source à partir d'une feuille de calcul Excel, coller le tout dans Notepad ++, en cours d'exécution find / Replaces sur pour insérer la syntaxe SQL nécessaire, et Chunking puis comme par la limite de caractères.

Alors, en quelques mots, ma question est la suivante: ai-je exploré ce dans la mesure de ce qui est déjà possible? Y at-il quelque chose de grand et je évidente me manque, ou devrais-je être aller à ce sujet d'une manière complètement différente? Les points bonus pour moins de caractères par cas!

Était-ce utile?

La solution

Le SET peut être un peu plus simple:

SET info4 = 'BNID: ' +
  CASE guestid
    WHEN 12345 THEN '917546553'
    WHEN 67890 THEN 'B04695465'
      [etc, etc.]
                          --- no ELSE here
  END 

WHERE info4 IS NULL       --- and this is needed

Enregistre 6 caractères par cas.


Si vous pouvez créer une table (même temporaire), vous pouvez également utiliser:

--- run once
CREATE TABLE #tmp
( guestid INT NOT NULL
, i4 VARCHAR(200)
, PRIMARY KEY (guestid)
) ;

--- as many times as needed
INSERT INTO #tmp VALUES
(12345,'917546553'),
...
(67890,'B04695465');

et

UPDATE guest
  SET info4 = 'BNID: ' + i4
FROM guest
  JOIN #tmp
    ON #tmp.guestid = guest.guestid
WHERE guest.info4 IS NULL

Autres conseils

Essayez quelque chose comme ceci:

WHILE 1=1
BEGIN
    UPDATE TOP (10000) guest
    SET info4 = CASE guestid
    WHEN 12345 THEN 'BNID: 917546553'
    WHEN 67890 THEN 'BNID: B04695465'
    [etc, etc.]
    ELSE info4
    END
    WHERE info4 IS NULL
    IF @@ROWCOUNT<10000 BREAK;
END

Ceci mettra à jour 10k lignes à la fois. Étant donné que les seules lignes que vous devez mettre à jour auront un NULL pour info4, nous filtrons pour cela.

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top