Mehr

Suchen Sie Duplikate in einem Feld und aktualisieren Sie dann ein anderes Feld mit einem Y oder N mit Python (ArcGIS)


Ich versuche, ein Python-Skript (ArcGIS 10.1) zu erstellen, das doppelte Datensätze in einem Punkte-Shapefile mit einem Y oder N identifiziert (Möglichkeit von über 5000 Datensätzen). Ähnlich wie dies:

xyKombinieren | duplizieren

E836814.148873 N814378.125749 |

E836814.148873 N814378.125749 |

E836815.033548 N814377.614688 |

E836815.033548 N814377.614688 |

E836815.033548 N814377.614688 |

E836818.016542 N814371.411850 |

Ich möchte das Feld xyCombine für Duplikate verarbeiten und ein anderes Feld (dplicate) mit einem Y oder N aktualisieren, wenn es ein Duplikat ist oder nicht. Mit dem gewünschten Ergebnis als (muss nicht sortiert werden):

xyKombinieren | duplizieren

E836814.148873 N814378.125749 | Ja

E836814.148873 N814378.125749 | Ja

E836815.033548 N814377.614688 | Ja

E836815.033548 N814377.614688 | Ja

E836815.033548 N814377.614688 | Ja

E836818.016542 N814371.411850 | Nein

Unten ist mein Versuch:

# Prozess: Durchsucht das xyCombine-Feld nach allen Duplikaten = False und len(str(shpFRow.getValue(fieldName)).strip()) > 1: fieldList.append(shpFRow.getValue(fieldName)) shpFRow = shpFRows.next() DuplicateList = [x für x, y in Sammlungen .Counter(fieldList).items() if y > 1] print doubleList selectFile = pointsShapefile selectFields = ('xyCombine','dupCHK') shpFRows = arcpy.UpdateCursor(selectFile,selectFields) shpFRow1 = shpFRows.nhpFRow1 while : if shpFRow1.isNull(fieldName) == False und len(str(shpFRow1.getValue(fieldName)).strip()) > 1: für Zeile in doppelter Liste: if shpFRow1.getValue(fieldName) == Zeile: Duplikat += 1 row[1] = "Y" else: row[1] = "N" cursor.updateRow(row) shpFRow1 = shpFRows.next() if DuplicateCount > 0: print "" print "*** "+str(duplicate) +" doppelte Punkte. ***" drucken ""

Wenn ich nicht einschließe:

row[1] = "Y" sonst: row[1] = "N" cursor.updateRow(row)

Das Skript führt die Gesamtmenge der Duplikate ordnungsgemäß aus, aktualisiert jedoch die Feldduplikate weder mit Y- noch mit N-Werten, was wichtig ist, da es später im Skript einen CSV-Fehlerbericht ausgibt.

Wenn ich es jedoch einfüge, erhalte ich die folgende Fehlermeldung:

Python 2.7.2 (Standard, 12. Juni 2011, 15:08:59) [MSC v.1500 32 Bit (Intel)] auf win32

[u'E836814.148873 N814378.125749', u'E836815.033548 N814377.614688', u'E836818.016542 N814371.41185']

Traceback (letzter Aufruf zuletzt): Datei "C: Duplicate Points CheckPython ScriptsDuplicatePointsCheck_TEST1.py", Zeile 458, in DuplicatePointsCheck() Datei "C: Duplicate Points CheckPython ScriptsDuplicatePointsCheck_TEST1.py", Zeile 94, in DuplicatePointsCheck row[1] = "N" TypeError: 'unicode'-Objekt unterstützt keine Elementzuweisung>>>

Mir ist bekannt, dass es in ArcGIS Werkzeuge gibt, die mögliche Lösungen über den Feldrechner bereitstellen. Ich möchte jedoch mein Verständnis von Python stärken, da ich noch recht neu in Python bin. Ich entschuldige mich, wenn diese Frage schon einmal gestellt wurde, aber ich habe das Internet durchforstet und die einzigen Ergebnisse meiner Suche bestanden darin, doppelte Datensätze zu finden und zu entfernen.


Nach zahlreichen Versuchen (mit dem Vorschlag von @Michael Miles-Stimson) habe ich versucht, den Code so weit wie möglich zu reduzieren und kam auf Folgendes:

inShapefile = pointsShapefile inShapefileFields = ('xyCombine','dplicate') valueList = list() DuplicatePointsCount = 0 with arcpy.da.UpdateCursor(inShapefile,inShapefileFields) als Cursor: für Zeile im Cursor: if (valueList.count(row[0 .) ]) > 1): row[1] = "Y" DuplicatePointsCount += 1 else: row[1] = "N" cursor.updateRow(row) print "" print "*** "+str(duplicatePointsCount)+" doppelte Punkte."

Aus irgendeinem Grund konnte ich den folgenden Teil jedoch nicht zum Laufen bringen, und er schrieb weiterhin "N" in das Dplicate-Feld für alle Datensätze.

if (valueList.count(row[0]) > 1): row[1] = "Y" DuplicatePointsCount += 1

Ich habe dann den Code von @ Emil Brundage versucht. Und es hat super funktioniert!


Ihr Code sieht für mich etwas zu komplex aus, um ihn zu entziffern, aber erlauben Sie mir, ein vereinfachtes Skript vorzustellen, das Ihr Ziel erreichen sollte. Es verwendet eine InitialeSuchcursorDuplikate zu ermitteln. Dies geschieht durch das Auffüllen von Listen. Es füllt eine Liste aller Werte, die einmal vorkommen, und eine zweite Liste von Werten, die mehr als einmal vorkommen. Es initiiert dann eineCursor aktualisierenum Ihr Y/N-Feld auszufüllen.

from arcpy import * inShapefile = pointsShapefile checkField = "xyCombine" updateField = "dplicate" #Liste der einmal gefundenen Werte trittOnce = [] #Liste der zweimal gefundenen Werte trittTwice = [] Cursor = da.SearchCursor (inShapefile, [checkField]) for Zeile im Cursor: #Prüfwert ist nicht null, wenn Zeile[0]: #Wenn nicht bereits zweimal gefunden, fortfahren, wenn nicht Zeile[0] in erscheintTwice: #Wenn noch nicht einmal aufgetreten ist, wenn nicht Zeile[0] in auftrittOnce: #Hinzufügen zu tritt einmal auf Liste auftrittOnce.append (row[0]) #Wenn der Wert bereits einmal gefunden wurde else: #Hinzufügen zu zweimal auftritt Liste (Duplikate) eventsTwice.append (row[0]) del cursor cursor = da .UpdateCursor (inShapefile, [checkField, updateField]) für Zeile im Cursor: #Check value is not null if row[0]: #check if value in showsTwice list (dh ist doppelt vorhanden) if row[0] in eventsTwice: row[ 1] = "Y" sonst: row[1] = "N" cursor.updateRow(row) del cursor

Ich hoffe das hilft!


Sie geben nicht an, welche Version von arcmap Sie verwenden. Wenn Sie über eine erweiterte Version verfügen, können Sie versuchen, das Tool „Identisch suchen“ zu verwenden.

http://resources.arcgis.com/en/help/main/10.1/index.html#//001700000054000000

Es kann mehrere Felder umfassen, sodass kein Text verkettet werden muss.


Wie kann ich zwei oder mehr Abfragesätze in einer Django-Ansicht kombinieren?

Ich versuche, die Suche nach einer von mir erstellten Django-Site aufzubauen, und bei dieser Suche suche ich in drei verschiedenen Modellen. Und um eine Paginierung in der Suchergebnisliste zu erhalten, möchte ich eine generische object_list-Ansicht verwenden, um die Ergebnisse anzuzeigen. Aber dazu muss ich drei Querysets zu einem zusammenführen.

Wie kann ich das machen? Ich habe das probiert:

Aber das funktioniert nicht. Ich erhalte eine Fehlermeldung, wenn ich versuche, diese Liste in der generischen Ansicht zu verwenden. In der Liste fehlt das Klonattribut.

Wie kann ich die drei Listen page_list , article_list und post_list zusammenführen?


Wenn Sie eine neue Liste von Wörterbüchern erstellen und diese durch Entfernen von Duplikaten zusammenführen möchten, funktioniert dies einfach.

Sie können die Listen-in-Strings in dict s mit dem Namen umwandeln und dann aktualisieren:

Dann, wenn Sie eine Liste zurück wollen, ist es nur

Sie erwähnen die Sortierung in Ihrem Titel. Wenn Sie diese Liste nach Namen sortieren möchten:

Das erste, was Sie beachten sollten, ist, dass Sie nicht über zwei verschiedene Wörterbücher verfügen. Du hast zwei verschiedene Listen von Wörterbüchern. Die zweite ist, dass Sie nicht genau erklären, was als Duplikat gilt. Die dritte ist, dass Sie nicht sagen, was mit dem Relevanzschlüssel zu tun ist.

Ich gehe davon aus, dass zwei Wörterbücher mit gleichwertigen Typ- und Namensschlüsseln identisch sind und die Relevanzwerte in einer Liste zusammengeführt werden sollen. Später könntest du sie dann mitteln oder was auch immer.


Andere Dinge

Lesbarkeit, Standardverfahren

Der Code sieht in models.py und view.py pythonisch und nett aus, in der "Front-End"-Datei (Eintragsdatei) etwas weniger gut. Ich hätte mir auch einige Tests gewünscht.

Ich denke, Sie dokumentieren ein wenig zu viel, ein gutes Beispiel ist:

Ich denke, Sie können davon ausgehen, dass die meisten Leser wissen, was Repr ist und tut.

Ich habe auch gesehen, dass Sie nur drei Commits in Ihrem Repo haben. Vielleicht möchten Sie an Ihrem Versionskontroll-Workflow arbeiten.

Ich denke, Sie sollten keine Art von Passwort zulassen, und ich denke, Sie sollten den Benutzer mehr als nur benachrichtigen, dass er ein unsicheres Passwort ausgewählt hat. Wenn Sie keine strengen Passwörter erzwingen möchten, können Sie sie einfach bitten, zur Bestätigung erneut ein unsicheres einzugeben.

Kontextmanager

Ich mag die Idee eines Kontextmanagers für Ihre Sitzungen, aber seien Sie vorsichtig, um potenzielle Fehler in Ihrer __exit__-Funktion zu behandeln.

Überraschendes Verhalten/Aufforderung

Geben Sie auf die gleiche Weise Fehler in Ihrem Backend aus, aber behandeln Sie sie selbst im Frontend, tun Sie dies nicht:

Refactoring

Einige Ihrer if -Klauseln sollten elif sein (oder Sie könnten zu dicts umgestalten), und ich würde es vorziehen, Ihre Schleifen überarbeitet zu sehen.


Verbindung zum MySQL-Server herstellen

Zu diesem Zeitpunkt sollten wir MySQL Community Server auf unserem System eingerichtet haben. Jetzt müssen wir Code in Python schreiben, mit dem wir eine Verbindung zu diesem Server herstellen können.

Eine Funktion um sich mit unserem MySQL Server zu verbinden

Eine wiederverwendbare Funktion für solchen Code zu erstellen ist Best Practice, damit wir diese mit minimalem Aufwand immer wieder verwenden können. Sobald dies einmal geschrieben wurde, können Sie es auch in Zukunft in all Ihren Projekten wiederverwenden, also in Zukunft - Sie werden dankbar sein!

Gehen wir das Zeile für Zeile durch, damit wir verstehen, was hier passiert:

In der ersten Zeile benennen wir die Funktion (create_server_connection) und benennen die Argumente, die diese Funktion annehmen wird (host_name, user_name und user_password).

Die nächste Zeile schließt alle bestehenden Verbindungen, damit der Server nicht mit mehreren offenen Verbindungen verwechselt wird.

Als nächstes verwenden wir einen Python try-except-Block, um mögliche Fehler zu behandeln. Der erste Teil versucht, mithilfe der Methode mysql.connector.connect() eine Verbindung zum Server herzustellen, wobei die vom Benutzer in den Argumenten angegebenen Details verwendet werden. Wenn dies funktioniert, gibt die Funktion eine kleine Erfolgsmeldung aus.

Der Ausnahmeteil des Blocks gibt den Fehler aus, den MySQL Server zurückgibt, falls ein Fehler aufgetreten ist.

Wenn die Verbindung erfolgreich ist, gibt die Funktion schließlich ein Verbindungsobjekt zurück.

In der Praxis nutzen wir dies, indem wir die Ausgabe der Funktion einer Variablen zuweisen, die dann zu unserem Verbindungsobjekt wird. Wir können dann andere Methoden (wie den Cursor) darauf anwenden und andere nützliche Objekte erstellen.

Hier ist pw eine Variable, die das Root-Passwort für unseren MySQL-Server als String enthält.

Dies sollte eine Erfolgsmeldung erzeugen:

Hurra!

Erstellen einer neuen Datenbank

Nachdem wir nun eine Verbindung hergestellt haben, besteht unser nächster Schritt darin, eine neue Datenbank auf unserem Server zu erstellen.

In diesem Tutorial werden wir dies nur einmal tun, aber wieder werden wir dies als wiederverwendbare Funktion schreiben, damit wir eine schöne nützliche Funktion haben, die wir für zukünftige Projekte wiederverwenden können.

Diese Funktion benötigt zwei Argumente, connection (unser Verbindungsobjekt) und query (eine SQL-Abfrage, die wir im nächsten Schritt schreiben werden). Es führt die Abfrage im Server über die Verbindung aus.

Wir verwenden die Cursor-Methode für unser Verbindungsobjekt, um ein Cursor-Objekt zu erstellen (MySQL Connector verwendet ein objektorientiertes Programmierparadigma, daher gibt es viele Objekte, die Eigenschaften von übergeordneten Objekten erben).

Dieses Cursor-Objekt verfügt über Methoden wie execute, executemany (die wir in diesem Tutorial verwenden werden) zusammen mit mehreren anderen nützlichen Methoden.

Wenn es hilft, können wir uns das Cursor-Objekt so vorstellen, dass es uns Zugriff auf den blinkenden Cursor in einem MySQL Server-Terminalfenster bietet.

Weißt du, dieser.

Als nächstes definieren wir eine Abfrage zum Erstellen der Datenbank und rufen die Funktion auf:

Alle in diesem Tutorial verwendeten SQL-Abfragen werden in meiner Einführung in die SQL-Tutorialreihe erklärt, und der vollständige Code ist im zugehörigen Jupyter Notebook in diesem GitHub-Repository zu finden, daher werde ich hier keine Erklärungen geben, was der SQL-Code macht Lernprogramm.

Dies ist jedoch vielleicht die einfachste mögliche SQL-Abfrage. Wenn Sie Englisch lesen können, können Sie wahrscheinlich herausfinden, was es tut!

Die Ausführung der Funktion create_database mit den oben genannten Argumenten führt dazu, dass auf unserem Server eine Datenbank namens 'school' erstellt wird.

Warum heißt unsere Datenbank „Schule“? Vielleicht wäre jetzt ein guter Zeitpunkt, sich genauer anzusehen, was wir in diesem Tutorial implementieren werden.

Unsere Datenbank

Das Entity-Relationship-Diagramm für unsere Datenbank.

Dem Beispiel meiner vorherigen Serie folgend, werden wir die Datenbank für die International Language School implementieren - eine fiktive Sprachschule, die Firmenkunden professionellen Sprachunterricht anbietet.

Dieses Entity-Relationship-Diagramm (ERD) stellt unsere Entitäten (Lehrer, Kunde, Kurs und Teilnehmer) dar und definiert die Beziehungen zwischen ihnen.

Alle Informationen darüber, was eine ERD ist und was bei der Erstellung und dem Design einer Datenbank zu beachten ist, finden Sie in diesem Artikel.

Der rohe SQL-Code, die Datenbankanforderungen und die Daten für die Datenbank sind alle in diesem GitHub-Repository enthalten, aber Sie werden alles sehen, wenn wir auch dieses Tutorial durchgehen.

Verbindung zur Datenbank herstellen

Nachdem wir nun eine Datenbank in MySQL Server erstellt haben, können wir unsere create_server_connection-Funktion ändern, um eine direkte Verbindung zu dieser Datenbank herzustellen.

Beachten Sie, dass es möglich ist - tatsächlich üblich - mehrere Datenbanken auf einem MySQL-Server zu haben, daher möchten wir immer und automatisch eine Verbindung zu der Datenbank herstellen, an der wir interessiert sind.

Dies ist genau dieselbe Funktion, aber jetzt nehmen wir ein weiteres Argument - den Datenbanknamen - und übergeben es als Argument an die Methode connect().

Erstellen einer Abfrageausführungsfunktion

Die letzte Funktion, die wir (vorerst) erstellen werden, ist äußerst wichtig - eine Funktion zur Ausführung von Abfragen. Dabei werden unsere SQL-Abfragen, die in Python als Strings gespeichert sind, an die Methode cursor.execute() übergeben, um sie auf dem Server auszuführen.

Diese Funktion ist genau die gleiche wie unsere create_database-Funktion von früher, außer dass sie die Methode connection.commit() verwendet, um sicherzustellen, dass die in unseren SQL-Abfragen beschriebenen Befehle implementiert werden.

Dies wird unsere Arbeitspferdfunktion sein, die wir (neben create_db_connection) verwenden werden, um Tabellen zu erstellen, Beziehungen zwischen diesen Tabellen herzustellen, die Tabellen mit Daten zu füllen und Datensätze in unserer Datenbank zu aktualisieren und zu löschen.

Wenn Sie ein SQL-Experte sind, können Sie mit dieser Funktion alle komplexen Befehle und Abfragen direkt aus einem Python-Skript ausführen. Dies kann ein sehr leistungsfähiges Werkzeug für die Verwaltung Ihrer Daten sein.


Wie kann ich ein Excel mit Tausenden von Postleitzahldatensätzen (kein Breitengrad/Langzeit) mit einem Postleitzahlenschwerpunkt-Shapefile mit Breitengrad/Längen zusammenführen?

Ich führe einen Beispieltestlauf für einen viel größeren Datensatz aus. Mir wurde eine Excel-Tabelle mit 3000 Datensätzen mit Postleitzahlen (und anderen Daten) zur Verfügung gestellt, jedoch ohne andere Geodaten. Ich versuche daraus ein Shapefile zu erstellen.

Aufgrund der Vielzahl doppelter Postleitzahlen stoße ich jedoch auf ein Problem. Ich finde es schwierig, mit einem von mir erstellten Shapefile mit Postleitzahl-Schwerpunkt (mit lat/long) zu "verknüpfen".

Ist es möglich, und wenn ja, wie, das Zentroid-Postleitzahl-Shapefile zusammenzuführen/beizutreten und die Excel-Tabelle automatisch mit der zugehörigen Breite/Länge zu füllen, wobei die doppelten Postleitzahlen beibehalten werden? Dieses Ergebnis dann in ein eigenes Shapefile exportieren? Beispiel: Das verbundene Ergebnis würde die 3000 Datensätze mit den doppelten Postleitzahlen anzeigen, aber sind jetzt die Breiten-/Längenangaben damit verknüpft, damit sie zugeordnet und analysiert werden können?


Zusammenfassung

Damit ist unser Blog vervollständigt. Im ersten Teil habe ich vier der sechs Schritte zum Erstellen unserer Beispiellösung erklärt. Ich habe wertvolle Informationen zu Export Subnetwork und zum Herunterladen und Analysieren der JSON-Rückgabe des Tools geteilt. In diesem zweiten Teil haben wir das Beispiel mit den letzten beiden Schritten abgeschlossen und ich habe die JSON-Ausgabe des Export-Subnetzwerks ausführlich besprochen, die Arbeit mit dem Feature-Service Ihres Versorgungsnetzes und seinen Datenelementen, die Feature-Erstellung einschließlich Geometrie aus JSON und das Ändern codierter Domänen domain zu benutzerfreundlichen Beschreibungen und dynamisches Schreiben in mehrere Ausgaben. Insgesamt habe ich gezeigt, wie Sie mit der Data Interoperability-Erweiterung von ArcGIS Pro ein Automatisierungswerkzeug für das Exportieren von Subnetzwerken erstellen. Schließlich habe ich Ihnen gezeigt, wie Sie parametrisierte Workbenches ausführen und konfigurieren und wie Sie die Spatial ETL-Toolbox in Pro verwenden. Diese Workbench-Datei ist jetzt bereit für die weitere Automatisierung, um alle Subnetzwerke jedes Versorgungsnetzwerks zu exportieren, was das Thema für meinen nächsten Blog sein wird.

Ich hoffe, Sie haben es bis hierher geschafft und fanden den Blog informativ und hilfreich. Bitte hinterlassen Sie unten Kommentare, wenn Sie Fragen zum bereitgestellten Beispiel oder zum Export-Subnetzwerk selbst haben.

Karten- und Bannerbilder von:


So durchsuchen Sie schnell eine sehr große Liste von Zeichenfolgen / Datensätzen in einer Datenbank

Ich habe folgendes Problem: Ich habe eine Datenbank mit mehr als 2 Millionen Datensätzen. Jeder Datensatz hat ein Zeichenfolgenfeld X und ich möchte eine Liste von Datensätzen anzeigen, für die Feld X eine bestimmte Zeichenfolge enthält. Jeder Datensatz ist etwa 500 Byte groß.

Um es konkreter zu machen: In der GUI meiner Anwendung habe ich ein Textfeld, in das ich einen String eingeben kann. Über dem Textfeld habe ich eine Tabelle mit den (ersten N, z. B. 100) Datensätzen, die mit der Zeichenfolge im Textfeld übereinstimmen. Wenn ich ein Zeichen in das Textfeld eintippe oder lösche, muss der Tabelleninhalt im laufenden Betrieb aktualisiert werden.

Ich frage mich, ob es einen effizienten Weg gibt, dies mit geeigneten Indexstrukturen und / oder Caching zu tun. Wie oben erklärt, möchte ich nur die ersten N Elemente anzeigen, die der Abfrage entsprechen. Daher sollte es für N, die klein genug sind, kein großes Problem sein, die passenden Elemente aus der Datenbank zu laden. Außerdem kann das Zwischenspeichern von Elementen im Hauptspeicher den Abruf beschleunigen.

Ich denke, das Hauptproblem besteht darin, die passenden Elemente angesichts der Musterzeichenfolge schnell zu finden. Kann ich mich auf einige DBMS-Funktionen verlassen oder muss ich selbst einen In-Memory-Index erstellen? Irgendwelche Ideen?

Ich habe ein erstes Experiment durchgeführt. Ich habe die Datensätze in verschiedene Textdateien aufgeteilt (maximal 200 Datensätze pro Datei) und die Dateien in verschiedene Verzeichnisse gelegt (ich habe den Inhalt eines Datenfelds verwendet, um den Verzeichnisbaum zu bestimmen). Am Ende habe ich ungefähr 50000 Dateien in ungefähr 40000 Verzeichnissen. Ich habe dann Lucene ausgeführt, um die Dateien zu indizieren. Die Suche nach einer Zeichenfolge mit dem Lucene-Demoprogramm ist ziemlich schnell. Das Aufteilen und Indizieren dauerte einige Minuten: Dies ist für mich völlig akzeptabel, da es sich um einen statischen Datensatz handelt, den ich abfragen möchte.

Der nächste Schritt besteht darin, Lucene in das Hauptprogramm zu integrieren und die von Lucene zurückgegebenen Treffer zu verwenden, um die relevanten Datensätze in den Hauptspeicher zu laden.


Eine gute Möglichkeit für diesen Vergleich besteht darin, find mit md5sum und dann mit diff zu verwenden.

Verwenden Sie find, um alle Dateien im Verzeichnis aufzulisten, berechnen Sie dann den md5-Hash für jede Datei und leiten Sie ihn nach Dateinamen sortiert an eine Datei weiter:

Führen Sie das gleiche Verfahren für das andere Verzeichnis aus:

Vergleichen Sie dann das Ergebnis zweier Dateien mit diff :

Oder als einzelner Befehl mit Prozesssubstitution:

Wenn Sie nur die Änderungen sehen möchten:

Der Befehl cut gibt nur den Hash (erstes Feld) aus, der von diff verglichen werden soll. Andernfalls wird diff jede Zeile ausgeben, da sich die Verzeichnispfade unterscheiden, selbst wenn der Hash gleich ist.

Aber Sie wissen nicht, welche Datei sich geändert hat.

Dafür kannst du sowas ausprobieren

Diese Strategie ist sehr nützlich, wenn sich die beiden zu vergleichenden Verzeichnisse nicht auf demselben Computer befinden und Sie sicherstellen müssen, dass die Dateien in beiden Verzeichnissen gleich sind.

Eine andere gute Möglichkeit, den Job zu erledigen, ist die Verwendung des diff-Befehls von Git (kann Probleme verursachen, wenn Dateien unterschiedliche Berechtigungen haben -> dann wird jede Datei in der Ausgabe aufgelistet):


18 Antworten 18

Wenn Sie aufgrund von Verbindungsproblemen eines der vielen Tools nicht verwenden können und einen "Offline"-Vergleich wünschen, können Sie SSMS verwenden, um Skripte für alle Datenbankobjekte zu generieren, indem Sie mit der rechten Maustaste auf die Datenbank klicken und "Aufgaben. / Skripte generieren" verwenden. Funktion und stellen Sie sicher, dass Sie eine Datei pro Objekt erstellen.

Wenn Sie dies für beide Datenbanken getan haben, laden Sie die beiden Skriptsätze auf einen lokalen Computer in zwei separaten Ordnern und verwenden Sie WinMerge (oder ähnlich), um die beiden zu vergleichen.

Nachdem ich mit einer einfachen Möglichkeit zu kämpfen hatte, dieselbe Aufgabe zu erledigen - sehen Sie, was sich zwischen 2 Modellen geändert hat, schrieb ich das folgende SQL-Skript, das zwei Schemas vergleicht, um neue und gelöschte Spalten zu bestimmen

Eine andere Möglichkeit ist die Verwendung von SQL Server Data Tools (SSDT), einer Erweiterung von Visual Studio. Sie können Ihr Datenbankschema als .dacpac-Datei extrahieren und mit einer anderen .dacpac-Datei oder einer vorhandenen Datenbank vergleichen. SSDT ist in den SQL Server 2012-Clienttools enthalten, wodurch es ziemlich zugänglich ist. Die vollständigen Anweisungen zum Ausführen des Vergleichs finden Sie auf der MSDN-Site.

Suchen Sie nach "SQL Server Compare" und Sie werden viele Tools finden. Bei meiner Arbeit verwenden wir Red Gate SQLCompare. Es hat eine 14-tägige Testversion. Aber da Sie von zwei verschiedenen Umgebungen sprechen, denke ich nicht, dass das für Sie funktionieren würde, es sei denn, der Client sendet Ihnen ein Backup seiner DB. Die andere Möglichkeit besteht darin, Abfragen für die Systemtabellen (wie sys.indexes, sys.tables usw.) zu schreiben.

Vielleicht kann Ihnen dieses kostenlose Skript https://github.com/dlevsha/compalex helfen. Es unterstützt Microsoft SQL Server.

Compalex ist ein kostenloses, leichtgewichtiges Skript zum Vergleichen zweier Datenbankschemas. Es unterstützt MySQL, MS SQL Server und PostgreSQL.

Wenn Sie mehr als eine Datenbankdatei vergleichen müssen, können Sie SQLPackage.exe scripten.

Ich habe keinen funktionierenden Code für Sie, aber Sie können sich die SQLPackage.exe-Dokumentation ansehen, um sich inspirieren zu lassen.

Sie würden Ihre Masterdatenbank in eine dacpac-Datei extrahieren und dann die dacpac-Datei mit dem Rest Ihrer Datenbanken vergleichen. Das Ergebnis des Vergleichs kann entweder ein XML-Bericht der Änderungen oder eine .sql-Datei sein, die Sie ausführen können, um die Datenbanken zu synchronisieren.

Sie können sich diesen Artikel oder diesen für Beispielcode ansehen.

Ich hatte genau dieselbe Frage und glaube, dass das Microsoft SQL Server Management Studio (SSMS) eine viel einfachere / einfachere Lösung bietet als alles, was ich hier gesehen habe. Ich habe eine Produktionsstätte mit MS SQL Server Express und bald werden es mehrere sein, auf denen ich kein VisualStudio oder andere Anwendungen außer SSMS installieren muss.

Klicken Sie also innerhalb von SSMS mit der rechten Maustaste auf die Datenbank, um das Schema zu erhalten. Wählen Aufgaben > Skripte generieren. einen Assistenten zu öffnen, um das Schema und die Konfiguration für die gesamte Datenbank (oder ausgewählte Objekte, wenn Sie möchten) zu skripten. Ich habe alle Standardoptionen außer dem Pfad/Dateinamen beibehalten, aber das Tool bietet eine Vielzahl von Optionen. Der Assistent hat eine SQL erstellt, die ich über OneDrive zurück auf meinen PC kopiert habe. Ich habe dann Notepad++ verwendet, um die SQL mit einer auf die gleiche Weise generierten Datei mit meiner SIT-Datenbank zu vergleichen. In Kommentaren muss man Treffer aus Datum/Uhrzeit herausfiltern, aber ansonsten ist es ein toller Vergleich der beiden Datenbanken.

Presto! Dies aufzuschreiben war deutlich schwieriger als den eigentlichen Vergleich.

Der einfachste Weg ist, Verwenden Sie ein automatisiertes Tool, das für diesen Zweck entwickelt wurde, aber wenn Sie keinen Zugriff darauf haben, können Sie alle grundlegenden Informationen, die Sie benötigen, aus den INFORMATION_SCHEMA-Ansichten abrufen.

Die Verwendung der Metadaten in INFORMATION_SCHEMA ist wahrscheinlich eine einfachere Option als das Generieren von DDL-Skripten und einen Quellvergleich, da Sie viel mehr Kontrolle darüber haben, wie die Daten dargestellt werden. Sie können die Reihenfolge, in der generierte Skripts die Objekte in einer Datenbank darstellen, nicht wirklich steuern. Außerdem enthalten die Skripte eine Menge Text, der standardmäßig von der Implementierung abhängig sein kann und eine Menge "Rauschen" verursachen kann, wenn Sie sich wahrscheinlich wirklich auf eine fehlende Tabelle, Ansicht oder Spalte oder möglicherweise einen Spaltendatentyp konzentrieren müssen oder Größenunterschiede.

Schreiben Sie eine Abfrage (oder Abfragen), um die für Ihren Code wichtigen Informationen aus den INFORMATION_SCHEMA-Ansichten abzurufen, und führen Sie sie auf jedem SQL Server über SSMS aus. Sie können dann entweder die Ergebnisse in eine Datei speichern und ein Textdatei-Vergleichstool (sogar MS Word) verwenden oder die Ergebnisse in Tabellen speichern und SQL-Abfragen ausführen, um Nichtübereinstimmungen zu finden.

Ich füge diese Antwort wegen einer neuen Frage ein, die als Duplikat markiert wurde.

Ich musste einmal zwei Produktionsdatenbanken vergleichen und alle Schemaunterschiede zwischen ihnen finden. Die einzigen interessanten Elemente waren hinzugefügte oder gelöschte Tabellen und hinzugefügte, entfernte oder geänderte Spalten. Ich habe die von mir entwickelten SQL-Skripte nicht mehr, aber was folgt, ist die allgemeine Strategie. Und die Datenbank war nicht SQL Server, aber ich denke, die gleiche Strategie gilt.

Zuerst habe ich eine Metadatenbank erstellt, die am besten als Metadatenbasis bezeichnet werden kann. Die Benutzertabellen dieser Datenbank enthielten Datenbeschreibungen, die aus den Systemtabellen der Produktionsdatenbanken kopiert wurden. Dinge wie Tabellenname, Spaltenname, Datentyp und Genauigkeit. Es gab ein weiteres Element, Datenbankname, das in keiner der Produktionsdatenbanken vorhanden war.

Als nächstes entwickelte ich Skripte, die Auswahlen aus den Systemtabellen der Produktionsdatenbanken mit Einfügungen in die Benutzertabellen der Metadatenbasis koppelten.

Schließlich entwickelte ich Abfragen, um Tabellen zu finden, die in einer Datenbank vorhanden waren, aber nicht in der anderen, und Spalten aus Tabellen in beiden Datenbanken, die nur in einer Datenbank vorhanden waren, und Spalten mit inkonsistenten Definitionen zwischen den beiden Datenbanken.

Von etwa 100 Tabellen und 600 Spalten fand ich eine Handvoll Inkonsistenzen und eine Spalte, die in einer Datenbank als Gleitkomma und in der anderen als Ganzzahl definiert war. Letzteres stellte sich als Glücksfall heraus, denn es deckte ein Problem auf, das eine der Datenbanken seit Jahren quälte.

Das Modell für die Metadatenbasis wurde von den betreffenden Systemtabellen vorgeschlagen. Die Abfragen waren nicht schwer zu konstruieren und drehten sich hauptsächlich um Gruppieren nach und mit Anzahl (Datenbankname) = 1.

In Ihrem Fall mit 700 Produktionsdatenbanken möchten Sie vielleicht die ersten beiden Schritte stärker automatisieren als ich es mit nur zwei Datenbanken zum Vergleich getan habe. Aber die Idee ist ähnlich.