Více

Najděte duplikáty v poli a poté aktualizujte jiné pole pomocí Y nebo N pomocí Pythonu (ArcGIS)

Najděte duplikáty v poli a poté aktualizujte jiné pole pomocí Y nebo N pomocí Pythonu (ArcGIS)


Pokouším se vytvořit skript v Pythonu (ArcGIS 10.1), který bude identifikovat duplicitní záznamy v tvarovém souboru bodů s Y nebo N (možnost více než 5000 záznamů). Podobné tomuto:

xyCombine | duplikát

E836814.148873 N814378.125749 |

E836814.148873 N814378.125749 |

E836815.033548 N814377.614688 |

E836815.033548 N814377.614688 |

E836815.033548 N814377.614688 |

E836818.016542 N814371.411850 |

Chtěl bych zpracovat pole xyCombine pro duplikáty a aktualizovat další pole (dplicate) s Y nebo N, pokud je to duplikát nebo ne. S požadovaným výsledkem jako (nemusí být tříděno):

xyCombine | duplikát

E836814.148873 N814378.125749 | Y

E836814.148873 N814378.125749 | Y

E836815.033548 N814377.614688 | Y

E836815.033548 N814377.614688 | Y

E836815.033548 N814377.614688 | Y

E836818.016542 N814371.411850 | N

Níže je můj pokus:

# Proces: Hledá v poli xyCombine duplikáty duplicateCount = 0 inShapefile = pointsShapefile fieldName = "xyCombine" shpFRows = arcpy.UpdateCursor (inShapefile) shpFRow = shpFRows.next () fieldList = [] zatímco shpFRow: ifull pole = if = False and len (str (shpFRow.getValue (fieldName)). Strip ())> 1: fieldList.append (shpFRow.getValue (fieldName)) shpFRow = shpFRows.next () duplicateList = [x pro x, y ve sbírkách .Counter (fieldList) .items () if y> 1] print duplicateList selectFile = pointsShapefile selectFields = ('xyCombine', 'dupCHK') shpFRows = arcpy.UpdateCursor (selectFile, selectFields) shpFRow1 = shpFRows.next () while shpFRows.next () while if shpFRow1.isNull (fieldName) == False and len (str (shpFRow1.getValue (fieldName)). strip ())> 1: pro řádek v duplicateList: pokud shpFRow1.getValue (fieldName) == řádek: duplikát + = 1 řádek [1] = "Y" else: řádek [1] = "N" cursor.updateRow (řádek) shpFRow1 = shpFRows.next () pokud duplicateCount> 0: print "" print "***" + str (duplikát) + "duplicitní body. ***" tisk ""

Pokud neuvedu:

řádek [1] = "Y" else: řádek [1] = "N" cursor.updateRow (řádek)

Skript provede správné vytištění celkového množství duplikátů, ale neaktualizuje duplikáty polí s hodnotami Y nebo N, což je důležité, protože později ve skriptu poskytne zprávu o chybě CSV.

Když to však zahrnu, zobrazí se následující chybová zpráva:

Python 2.7.2 (výchozí, 12. června 2011, 15:08:59) [MSC v.1500 32 bitů (Intel)] na win32

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

Traceback (poslední hovor poslední): Soubor "C: Duplicate Points Check Python Scripts DuplicatePointsCheck_TEST1.py", řádek 458, v souboru DuplicatePointsCheck () File "C: Duplicate Points Check Python Scripts DuplicatePointsCheck_TEST1.py", řádek 94, v řádku DuplicatePointsCheck [1] = "N" TypeError: objekt 'unicode' nepodporuje přiřazování položek >>>

Chápu, že v ArcGIS existují nástroje, které poskytnou možná řešení prostřednictvím polní kalkulačky. Chci však posílit své chápání Pythonu, protože jsem v Pythonu zcela nový. Omlouvám se, pokud byla tato otázka položena dříve, ale prošel jsem internetem a jediné výsledky mého hledání zahrnovaly vyhledání a odstranění duplicitních záznamů.


Po mnoha pokusech (s návrhem @Michael Miles-Stimson) jsem se pokusil jednoduše a svléknout kód co nejvíce a přišel s tímto:

inShapefile = pointsShapefile inShapefileFields = ('xyCombine', 'dplicate') valueList = list () duplicatePointsCount = 0 s arcpy.da.UpdateCursor (inShapefile, inShapefileFields) jako kurzor: pro řádek v hodnotě kurzoru: if ( ])> 1): řádek [1] = "Y" duplicatePointsCount + = 1 else: řádek [1] = "N" cursor.updateRow (řádek) tisk "" tisk "***" + str (duplicatePointsCount) + " duplicitní body. “

Z nějakého důvodu se mi ale nepodařilo spustit níže uvedenou část a pokračovalo se psaním „N“ do pole duplikát pro všechny záznamy.

if (valueList.count (řádek [0])> 1): řádek [1] = "Y" duplicatePointsCount + = 1

Pak jsem se pokusil o kód @Emil Brundage. A fungovalo to!


Váš kód vypadá trochu příliš složitý na to, abych ho mohl dešifrovat, ale dovolte mi představit zjednodušený skript, který by měl splnit váš cíl. Využívá iniciáluVyhledat kurzork určení duplikátů. Činí tak vyplněním seznamů. Vyplní jeden seznam všech hodnot, které se vyskytnou jednou, a druhý seznam hodnot, které se vyskytnou více než jednou. Poté zahájíUpdateCursork vyplnění pole Y / N.

z arcpy import * inShapefile = pointsShapefile checkField = "xyCombine" updateField = "dplicate" # Seznam nalezených hodnot jednou nastaneOnce = [] # seznam nalezených hodnot nastane dvakrátTwice = [] cursor = da.SearchCursor (inShapefile, [checkField]) pro řádek v kurzoru: # Check value is not null if row [0]: #If already already found to occur once, continue if not row [0] in occursTwice: #If yet occurs there once once if not row [0] in occursOnce: #Add to occurs once list occursOnce.append (řádek [0]) # Pokud byla hodnota již jednou nalezena: #Add to occurs dvakrát list (duplicates) occursTwice.append (řádek [0]) del cursor cursor = da .UpdateCursor (inShapefile, [checkField, updateField]) pro řádek v kurzoru: # Check value is not null if row [0]: #check if value in occursTwice list (ie is duplicate) if row [0] in occursTwice: row [ 1] = "Y" else: řádek [1] = "N" cursor.updateRow (řádek) del kurzor

Doufám, že to pomůže!


Neuvádíte, kterou verzi arcmap používáte. Pokud máte pokročilou verzi, můžete zkusit použít nástroj Najít identický.

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

Může trvat více polí, takže není nutné zřetězit text.


Jak mohu kombinovat dvě nebo více sad dotazů v zobrazení Django?

Snažím se vytvořit hledání pro web Django, který stavím, a v tomto hledání hledám tři různé modely. A abych získal stránkování na seznamu výsledků hledání, chtěl bych k zobrazení výsledků použít obecné zobrazení object_list. Ale k tomu musím spojit tři sady dotazů do jednoho.

Jak to mohu udělat? Zkusil jsem to:

Ale to nefunguje. Při pokusu o použití tohoto seznamu v obecném zobrazení se zobrazí chyba. V seznamu chybí atribut clone.

Jak mohu sloučit tři seznamy, page_list, article_list a post_list?


Pokud si přejete vytvořit nový seznam slovníků a chcete je sloučit odstraněním duplikátů, fungovalo by to jednoduše.

Seznamy v řetězcích můžete transformovat na dict s klíčem podle názvu a poté aktualizovat:

Pak, pokud chcete seznam zpět, je to jen

Ve svém názvu zmiňujete třídění. Chcete-li tento seznam seřadit podle názvu:

První věc, kterou si musíte uvědomit, je, že nemáte dva různé slovníky. Máte dva různé seznamy slovníků. Druhým je, že nevysvětlíte přesně, co se počítá jako duplikát. Třetí je, že neříkáte, co dělat s klíčem relevance.

Předpokládám, že dva slovníky s ekvivalentními klíči typu a názvu jsou totožné a že chcete sloučit hodnoty relevance do seznamu. Pak byste je mohli průměrovat, nebo cokoli jiného.


Jiné věci

Čitelnost, standardní postupy

Kód vypadá pythonicky a hezky v models.py a view.py, o něco méně dobře v souboru „front-end“ (entry). Také bych rád viděl nějaké testy.

Myslím, že trochu dokumentujete, dobrým příkladem je:

Myslím, že můžete předpokládat, že většina čtenářů bude vědět, co je repr a co dělá.

Také jsem viděl, že máte na repo pouze tři závazky. Možná budete chtít pracovat na pracovním postupu řízení verzí.

Nemyslím si, že byste měli povolit jakýkoli typ hesla, a myslím, že byste měli více než jen upozorňovat uživatele, že vybral nezabezpečené heslo. Pokud nechcete vynucovat přísná hesla, můžete je požádat o opětovné zadání nezabezpečeného hesla pro potvrzení.

Správce kontextu

Líbí se mi myšlenka vašeho správce relací kontextu, ale buďte opatrní při zpracování potenciálních chyb ve vaší funkci __exit__.

Překvapivé chování / výzva

Ve stejném duchu zvyšujte chyby ve svém back-endu, ale řešte je sami v front-endu, nedělejte to:

Refaktorování

Některé z vašich if -clauses by měly být elif (nebo byste se mohli refaktorovat na dicts) a já bych raději viděl vaše smyčky přepracované.


Připojení k serveru MySQL

V tomto okamžiku bychom měli mít v našem systému nastaven MySQL Community Server. Nyní musíme v Pythonu napsat nějaký kód, který nám umožní navázat spojení s tímto serverem.

Funkce pro připojení k našemu serveru MySQL

Vytvoření opakovaně použitelné funkce pro tento kód je osvědčeným postupem, abychom jej mohli s minimálním úsilím používat znovu a znovu. Jakmile je toto napsáno, můžete jej v budoucnu znovu použít ve všech svých projektech, takže budoucnost - budete vděční!

Pojďme projít tento řádek po řádku, abychom pochopili, co se tady děje:

První řádek je pojmenování funkce (create_server_connection) a pojmenování argumentů, které tato funkce vezme (host_name, user_name a user_password).

Další řádek zavře všechna existující připojení, aby nedošlo k záměně serveru s více otevřenými připojeními.

Dále použijeme blok pokusu kromě Pythonu ke zpracování případných chyb. První část se pokusí vytvořit připojení k serveru pomocí metody mysql.connector.connect () pomocí podrobností uvedených uživatelem v argumentech. Pokud to funguje, funkce vytiskne zprávu o úspěchu.

Výjimkou je část bloku, která vytiskne chybu, kterou MySQL Server vrátí, za nešťastné situace, že došlo k chybě.

Nakonec, pokud je připojení úspěšné, funkce vrátí objekt připojení.

To v praxi používáme tak, že výstup funkce přiřadíme proměnné, která se poté stane naším objektem připojení. Poté na něj můžeme použít jiné metody (například kurzor) a vytvořit další užitečné objekty.

Zde je pw proměnná obsahující heslo root pro náš server MySQL jako řetězec.

To by mělo vytvořit zprávu o úspěchu:

Hurá!

Vytvoření nové databáze

Nyní, když jsme navázali připojení, je naším dalším krokem vytvoření nové databáze na našem serveru.

V tomto tutoriálu to uděláme jen jednou, ale znovu to napíšeme jako opakovaně použitelnou funkci, takže máme pěknou užitečnou funkci, kterou můžeme znovu použít pro budoucí projekty.

Tato funkce má dva argumenty, připojení (náš objekt připojení) a dotaz (dotaz SQL, který napíšeme v dalším kroku). Spustí dotaz na serveru prostřednictvím připojení.

K vytvoření objektu kurzoru používáme metodu kurzoru na našem objektu připojení (MySQL Connector používá objektově orientované paradigma programování, takže existuje spousta objektů dědících vlastnosti z nadřazených objektů).

Tento objekt kurzoru obsahuje metody jako execute, executemany (které v tomto tutoriálu použijeme) spolu s několika dalšími užitečnými metodami.

Pokud to pomůže, můžeme myslet na objekt kurzoru, který nám poskytuje přístup k blikajícímu kurzoru v okně terminálu serveru MySQL.

Tohle víš.

Dále definujeme dotaz pro vytvoření databáze a volání funkce:

Všechny dotazy SQL použité v tomto kurzu jsou vysvětleny v mé úvodní sérii kurzů SQL a celý kód najdete v přidruženém Jupyter Notebooku v tomto úložišti GitHub, takže nebudu poskytovat vysvětlení toho, co v tomto kódu SQL dělá tutorial.

Toto je možná nejjednodušší možný dotaz SQL. Pokud umíte číst anglicky, pravděpodobně přijdete na to, co dělá!

Spuštění funkce create_database s výše uvedenými argumenty má za následek vytvoření databáze s názvem 'school' na našem serveru.

Proč se naše databáze nazývá „škola“? Možná by teď byla vhodná doba podívat se podrobněji na přesně to, co v tomto výukovém programu implementujeme.

Naše databáze

Diagram vztahu mezi entitami pro naši databázi.

Podle příkladu v mé předchozí sérii budeme implementovat databázi pro Mezinárodní jazykovou školu - fiktivní jazykovou školu, která poskytuje profesionální jazykové lekce pro firemní klienty.

Tento diagram vztahů s entitami (ERD) stanoví naše entity (učitel, klient, kurz a účastník) a definuje vztahy mezi nimi.

Všechny informace o tom, co je ERD a co je třeba vzít v úvahu při jeho vytvoření a návrhu databáze, najdete v tomto článku.

Nezpracovaný kód SQL, požadavky na databázi a data, která se mají do databáze dostat, jsou obsaženy v tomto úložišti GitHub, ale uvidíte vše, až projdeme tímto tutoriálem.

Připojení k databázi

Nyní, když jsme vytvořili databázi na serveru MySQL, můžeme upravit naši funkci create_server_connection tak, aby se připojovala přímo k této databázi.

Všimněte si, že je možné - ve skutečnosti běžné - mít více databází na jednom serveru MySQL, takže se chceme vždy a automaticky připojit k databázi, která nás zajímá.

Toto je přesně stejná funkce, ale nyní vezmeme ještě jeden argument - název databáze - a předáme jej jako argument metodě connect ().

Vytvoření funkce spuštění dotazu

Konečná funkce, kterou vytvoříme (prozatím), je velmi důležitá - funkce provádění dotazu. Toto vezme naše dotazy SQL uložené v Pythonu jako řetězce a předá je metodě cursor.execute (), která je provede na serveru.

Tato funkce je přesně stejná jako naše funkce create_database z dříve, kromě toho, že používá metodu connection.commit () k zajištění implementace příkazů podrobně popsaných v našich dotazech SQL.

Toto bude naše funkce workhorse, kterou použijeme (vedle create_db_connection) k vytváření tabulek, navázání vztahů mezi těmito tabulkami, naplnění tabulek daty a aktualizaci a mazání záznamů v naší databázi.

Pokud jste odborníkem na SQL, tato funkce vám umožní provádět všechny a všechny složité příkazy a dotazy, které byste mohli ležet, přímo ze skriptu Pythonu. Může to být velmi výkonný nástroj pro správu vašich dat.


Jak mohu sloučit Excel s tisíci záznamů zipcode (bez lat / long) s zipcode centroid shapefile s lat / long?

Používám ukázkový testovací běh pro mnohem větší datovou sadu. Byla mi poskytnuta tabulka aplikace Excel s 3000 záznamy se zipcodes (a dalšími daty), ale žádný jiný geoprostorový identifikátor. Snažím se z toho vytvořit tvarový soubor.

Došlo mi však k problému kvůli velkému množství duplicitních PSČ. Je pro mě & # x27m obtížné & quotjoin & quot pomocí zipcode centroid shapefile (s lat / long), který jsem vytvořil.

Je možné, a pokud ano, jak, sloučit / připojit se k souboru tvarového souboru zipcode a automaticky naplnit tabulku aplikace Excel přidruženou šířkou / délkou a zachovat duplicitní PSČ? Pak exportovat tento výsledek do vlastního obrazce? Například spojený výsledek by ukázal 3000 záznamů s duplicitními zipcodes, ale nyní je k nim přidružen lat / long, takže je možné je mapovat a analyzovat?


Souhrn

Tím je náš blog dokončen. V první části jsem vysvětlil čtyři ze šesti kroků k vytvoření našeho ukázkového řešení. Sdílel jsem cenné informace o exportu podsítě a o tom, jak stáhnout a analyzovat návrat JSON nástroje. V této druhé části jsme dokončili ukázku s posledními dvěma kroky a podrobně jsem diskutoval o výstupu JSON exportní podsítě, práci s funkcí služby vaší inženýrské sítě a jejích datových prvků, vytváření funkcí včetně geometrie z JSON a změna kódovaných domén k uživatelsky přívětivým popisům a dynamickému zápisu na více výstupů. Celkově jsem ukázal, jak vytvořit nástroj pro automatizaci exportu podsítě pomocí rozšíření Data Interoperability aplikace ArcGIS Pro. Nakonec jsem vám ukázal, jak spustit a zesilovat konfiguraci parametrizovaných pracovních stolů a jak používat Spatial ETL toolbox v Pro. Tento soubor pracovního stolu je nyní připraven na další automatizaci exportu celé podsítě jakékoli inženýrské sítě & # 8230, která bude tématem mého dalšího blogu.

Doufám, že jste se dostali až sem a našli jste blog poučný a užitečný. Níže zanechejte komentáře k jakýmkoli dotazům k uvedenému vzorku nebo k samotné podsíti exportu.

Obrázky karet a bannerů od:


Jak rychle prohledávat velmi velký seznam řetězců / záznamů v databázi

Mám následující problém: Mám databázi obsahující více než 2 miliony záznamů. Každý záznam má pole řetězce X a chci zobrazit seznam záznamů, pro které pole X obsahuje určitý řetězec. Každý záznam má velikost přibližně 500 bajtů.

Aby to bylo konkrétnější: v grafickém uživatelském rozhraní mé aplikace mám textové pole, kde mohu zadat řetězec. Nad textovým polem mám tabulku zobrazující (prvních N, např. 100) záznamů, které odpovídají řetězci v textovém poli. Když napíšu nebo odstraním jeden znak do textového pole, musí být obsah tabulky průběžně aktualizován.

Zajímalo by mě, jestli existuje efektivní způsob, jak toho dosáhnout pomocí vhodných indexových struktur a / nebo ukládání do mezipaměti. Jak je vysvětleno výše, chci zobrazit pouze prvních N položek, které odpovídají dotazu. Proto pro N dostatečně malý by neměl být velký problém při načítání odpovídajících položek z databáze. Kromě toho může ukládání do mezipaměti v hlavní paměti urychlit načítání.

Myslím, že hlavním problémem je, jak rychle najít odpovídající položky vzhledem k řetězci vzoru. Mohu se spolehnout na některá zařízení DBMS, nebo si musím nějaký index v paměti vytvořit sám? Nějaké nápady?

Provedl jsem první experiment. Rozdělil jsem záznamy do různých textových souborů (maximálně 200 záznamů na soubor) a soubory jsem vložil do různých adresářů (k určení adresářového stromu jsem použil obsah jednoho datového pole). Nakonec skončím s asi 50000 soubory v asi 40000 adresářích. Poté jsem spustil Lucene k indexování souborů. Hledání řetězce pomocí ukázkového programu Lucene je docela rychlé. Rozdělení a indexování trvalo několik minut: to je pro mě naprosto přijatelné, protože se jedná o statický datový soubor, který chci dotazovat.

Dalším krokem je integrace Lucene do hlavního programu a použití zásahů vrácených Lucene k načtení příslušných záznamů do hlavní paměti.


Dobrým způsobem, jak toto srovnání provést, je použít find s md5sum, potom diff.

Použijte find k vypsání všech souborů v adresáři, poté vypočítejte hash md5 pro každý soubor a posuňte jej podle názvu souboru do souboru:

Stejný postup proveďte i v jiném adresáři:

Pak porovnejte výsledek dvou souborů s rozdílem:

Nebo jako jediný příkaz využívající náhradu procesu:

Pokud chcete vidět pouze změny:

Příkaz cut vytiskne pouze hash (první pole), které má být porovnáno diffem. Jinak diff vytiskne každý řádek, protože cesty adresáře se liší, i když je hash stejný.

Ale nebudete vědět, který soubor se změnil.

K tomu můžete zkusit něco podobného

Tato strategie je velmi užitečná, když dva porovnávané adresáře nejsou ve stejném stroji a musíte se ujistit, že jsou soubory v obou adresářích stejné.

Dalším dobrým způsobem, jak to udělat, je použití příkazu Git's diff (může způsobit problémy, když soubory mají různá oprávnění -> každý soubor je pak uveden ve výstupu):


18 odpovědí 18

Pokud nemůžete použít jeden z mnoha nástrojů z důvodu problémů s připojením a chcete porovnat „offline“, můžete použít SSMS ke generování skriptů pro všechny databázové objekty kliknutím pravým tlačítkem na databázi a pomocí „Úkoly. / Generovat skripty“ funkce a ujistěte se, že jste vybrali vytvoření jednoho souboru na objekt.

Když to uděláte pro obě databáze, získejte dvě sady skriptů do místního počítače ve dvou samostatných složkách a porovnejte je pomocí WinMerge (nebo podobného).

Poté, co jsem se snažil snadno provést stejný úkol - podívejte se, co se změnilo mezi 2 modely, jsem napsal následující skript SQL, který porovná dvě schémata k určení nových a odstraněných sloupců

Další možností je použít SQL Server Data Tools (SSDT), rozšíření sady Visual Studio. Schéma databáze můžete extrahovat jako soubor .dacpac a porovnat jej s jiným souborem .dacpac nebo existující databází. SSDT je ​​součástí klientských nástrojů serveru SQL Server 2012, takže je docela dobře přístupný. Úplné pokyny, jak spustit porovnání, najdete na webu MSDN.

Vyhledejte výraz „Porovnání serveru SQL“ a najdete spoustu nástrojů. Ten, který používáme v mé práci, je Red Gate SQLCompare. Má 14denní zkušební verzi. Ale protože mluvíte o dvou různých prostředích, nemyslím si, že by to pro vás fungovalo, pokud vám klient nepošle zálohu jejich databáze. Druhou možností je zapisovat dotazy do systémových tabulek (například sys.indexes, sys.tables atd.).

Možná vám tento bezplatný skript https://github.com/dlevsha/compalex může pomoci. Podporuje Microsoft SQL Server.

Compalex je bezplatný odlehčený skript pro porovnání dvou databázových schémat. Podporuje MySQL, MS SQL Server a PostgreSQL.

Pokud potřebujete porovnat více než jeden databázový soubor, můžete skriptovat SQLPackage.exe.

Nemám pro vás pracovní kód, ale pro inspiraci byste se mohli podívat do dokumentace k SQLPackage.exe.

Extrahovali byste svou hlavní databázi do souboru dacpac a poté jej porovnali se zbytkem svých databází. Výsledkem srovnání může být buď XML zpráva o změnách, nebo soubor .sql, který můžete spustit k synchronizaci databází.

Můžete se podívat na tento článek nebo tento ukázkový kód.

Měl jsem přesně stejnou otázku a věřím, že Microsoft SQL Server Management Studio (SSMS) má mnohem jednodušší / jednodušší řešení než cokoli, co jsem zde viděl. Mám produkční web s MS SQL Server Express a brzy budu několik dalších, kde nechci instalovat VisualStudio nebo jiné aplikace než SSMS.

V rámci SSMS tedy klikněte pravým tlačítkem na databázi a získáte schéma. Vybrat Úkoly> Generovat skripty. otevřete průvodce, který skriptuje schéma a konfiguraci pro celou databázi (nebo vybrané objekty, pokud chcete). Zachoval jsem všechny výchozí možnosti kromě cesty / názvu souboru, ale nástroj má nepřeberné množství možností. Průvodce vytvořil jeden SQL, který jsem zkopíroval přes OneDrive zpět do mého PC. Pak jsem použil Notepad ++ k porovnání SQL se souborem vygenerovaným stejným způsobem proti mé databázi SIT. Musíte odfiltrovat přístupy od data / času v komentářích, ale jinak je to skvělé srovnání těchto dvou databází.

Rychle! Psát to bylo podstatně těžší než provést skutečné srovnání.

Nejjednodušší je používat automatizovaný nástroj vytvořený pro tento účel, ale pokud nemáte přístup k jednomu, můžete získat všechny základní informace, které potřebujete, ze zobrazení INFORMATION_SCHEMA.

Použití metadat v INFORMATION_SCHEMA je pravděpodobně jednodušší volba než generování skriptů DDL a porovnání zdrojů, protože máte mnohem větší kontrolu nad tím, jak jsou data prezentována. Nemůžete opravdu ovládat pořadí, ve kterém generované skripty prezentují objekty v databázi. Skripty také obsahují spoustu textu, který může být ve výchozím nastavení závislý na implementaci, a může způsobit spoustu nesouhlasného „šumu“, když se pravděpodobně musíte skutečně zaměřit na chybějící tabulku, pohled nebo sloupec nebo případně datový typ sloupce nebo nesoulad velikosti.

Napište dotaz (nebo dotazy), abyste získali informace, které jsou důležité pro váš kód, ze zobrazení INFORMATION_SCHEMA a spusťte jej na každém serveru SQL ze SSMS. Potom můžete buď vypsat výsledky do souboru a použít nástroj pro porovnání textových souborů (dokonce i MS Word), nebo můžete vypsat výsledky do tabulek a spustit dotazy SQL a najít neshody.

Zahrnuji tuto odpověď kvůli nové otázce, která byla označena jako duplikát.

Jednou jsem musel porovnat dvě produkční databáze a najít mezi nimi rozdíly ve schématu. Jedinými zajímavými položkami byly tabulky, které byly přidány nebo zrušeny, a sloupce, které byly přidány, odstraněny nebo pozměněny. Už nemám skripty SQL, které jsem vytvořil, ale následuje obecná strategie. A databáze nebyla SQL Server, ale myslím, že platí stejná strategie.

Nejprve jsem vytvořil to, co lze nejlépe popsat jako metadatabázi. Uživatelské tabulky této databáze obsahovaly popisy dat zkopírované ze systémových tabulek produkčních databází. Věci jako název tabulky, název sloupce, datový typ a přesnost. Byla tu ještě jedna položka Název databáze, která neexistovala v žádné z produkčních databází.

Dále jsem vyvinul skripty, které spojily výběry ze systémových tabulek produkčních databází s vložkami do uživatelských tabulek metadatabáze.

Nakonec jsem vyvinul dotazy k vyhledání tabulek, které existovaly v jedné databázi, ale ne v druhé, a sloupců z tabulek v obou databázích, které byly pouze v jedné databázi, a sloupců s nekonzistentními definicemi mezi těmito dvěma databázemi.

Z asi 100 tabulek a 600 sloupců jsem našel hrst nekonzistencí a jeden sloupec, který byl definován jako plovoucí čárka v jedné databázi a celé číslo v druhé. Ten poslední se ukázal být darem z nebes, protože odhalil problém, který už roky trápí jednu z databází.

Model pro metadatabázi navrhli příslušné systémové tabulky. Dotazy nebylo těžké postavit, točily se většinou kolem skupiny a měly count (název databáze) = 1.

Ve vašem případě, se 700 produkčními databázemi, možná budete chtít automatizovat první dva kroky více než já s pouhými dvěma databázemi k porovnání. Ale myšlenka je podobná.