Wörter zählen ohne Schleifen*

27. August 2009 admin Keine Kommentare

Gestern hat mich der Kollege Presseschauer auf eine Lösung unserer Schweizer Niederlassung (danke an Claus) aufmerksam gemacht die ich absolut faszinierend finde.

Wenn man einen Teilstring in einem Text finden möchte kann man dies mit einer ganz einfachen Berechnung durchführen. Man benötigt hierfür keine Schleifen um den gesuchten Text im Quelltext zu finden.

Hier die grundsätzliche Lösung:

(len()-len(replace(,,”)))/len()

Man ersetzt also den zu suchenden Text durch nichts (”) und zählt danach die Länge des verbleibenden Textes. Durch  Berechnung der Längendifferenz zwischen dem unveränderten Quellstring und dem “replace”ten String und anschließender Division durch die Länge des Suchtextes erhält man die Anzahl der Vorkommen des Suchtextes innerhalb des Quelltextes.

Wenn man diese Lösung nun in T-SQL übertragen möchte so stellen sich mir hierbei noch zwei weitere Fragen:

  • Wie kann ich nach einem ganzen Wort suchen?
  • Wie kann ich ggf. Case insensitive suchen?

Mehr…

KategorienSQL-Server 2005

Refresh Views – Metadaten aktualisieren

26. August 2009 admin Keine Kommentare

Eine häufig vorkommende Aufgabe bei der Wartung von Datenbanken ist die Anpassung von Tabellen. Wenn man z.B. in einer Tabelle den Datentyp ändert dann ist dies mit ein paar Klicks bzw. einem sehr kurzem Script schnell geschehen. Wenn diese Tabelle allerdings in Views verwendet wird, dann werden die Metadaten der View durch die Änderung der Feldattribute nicht automatisch mit geändert.

Manuell müsste man also jede betroffene View öffnen und sie dann mit einem ALTER-Kommando erneut abspeichern. Dies aktualisiert die Metadaten aller relevanten Felder mit den aktuellsten Werten.

Um jetzt nicht jedesmal ein ALTER-Kommando absetzen zu müssen, kann auch die Systemprozedur sp_refreshview verwendet werden.

In der Hilfe zu SQL-Server werden hierzu auch einfache Beispiele benannt:

 T-SQL |  copy code |? 
1
USE AdventureWorks;
2
GO
3
EXEC SP_REFRESHVIEW N'Sales.vIndividualCustomer';

Mehr…

KategorienSQL-Server 2005

Tabellenabhängigkeiten mit CTE rekursiv bestimmen

14. August 2009 admin Keine Kommentare

Um bei einer Beladung eines Datawarehouse bzw. Datamarts nicht mit Problemen bezüglich fehlender Fremdschlüssel-Referenzen konfrontiert zu werden, muss eine bestimmte Reihenfolge eingehalten werden. Diese Fill-Sequence definiert die Tabellen die befüllt werden müssen um später in der Liste auftauchende Tabellen ohne Probleme befüllen zu können.

Die selbe Reihenfolge wird übrigens auch bei der Erzeugung von Tabellenobjekten in einer Datenbank benötigt um die Objekte korrekt anlegen zu können (Foreign-Key-Verknüpfungen).

Nachfolgend findet man ein Script dass diese Reihenfolge als Ergebnis ausgibt:

Mehr…

KategorienSQL-Server 2005

Schleifen durch Datenbanken und Tabellen

20. Juli 2009 admin Keine Kommentare

Ich habe in diesem Blog schon mehrfach mit den Meta-Daten von SQL Server gearbeitet. Immer wieder steht man vor der Aufgabe, ein oder mehrere Kommandos auf jede Datenbank des Servers abzusetzten oder vielleicht auch Aufgaben für jede Tabelle einer bestimmten Datenbank durchzuführen. Wenn man dies machen muss und dazu nur die Objekte im Zugriff haben soll, für die man auch Rechte besitzt, dann führt dies zu teilweise doch recht umfangreichen Scripten.

In vielen Fällen benötigt man jedoch nur mal eine Schleife die alle Tabellennamen zurückgibt oder man möchte in jeder Datenbank ein bestimmtes Schema installieren usw.

Für solche einfachen Fälle stellt SQL Server zwei sehr interessante (und nicht dokumentierte) Systemprozeduren bereit die ich in der Hilfe nicht finden konnte. Da diese beiden Prozeduren allerdings, zumindest in meinem Umfeld, die tägliche Arbeit sehr erleichtern können, hier eine kurze Beschreibung:

  • master.sys.sp_MSforeachdb durchläuft alle Datenbanken des Servers
  • master.sys.sp_MSforeachtable durchläuft alle Tabellen der aktuellen Datenbank

Mehr…

KategorienSQL-Server 2005

Abhängigkeiten zwischen Objekten

8. Juli 2009 admin Keine Kommentare

Die Bestimmung von Abhängigkeiten von Objekten innerhalb einer Datenbank wird dann zum wichtigen Thema wenn z.B. Wartungsarbeiten anstehen. Auch bei Änderungen im Laufe eines Entwicklungszyklus kann es zu Situationen kommen die eine genauere Untersuchung von Abhängigkeiten bestimmter Objekte in der Datenbank notwendig erscheinen lassen.

SQL-Server stellt für solche Zwecke eine Stored-Procedure bereit, welche in ihrer Rückgabe zwei Resultsets liefert. Diese Ergebnismengen stellen die Verbindungen dar die ein definiertes Objekt zu anderen Objekten in der Datenbank aufweist. Eine Prozedur bzw. Funktion verwendet z.B. in ihrem Code eine Tabelle oder eine andere Funktion. All diese Abhängigkeiten liefert die Systemprozedur sp_depends dem Aufrufer zurück.

Im Management-Studio kann man mit einem Rechtsklick und der Auswahl Dependencies (Abhängigkeiten) eine etwas grafischere Ansicht bekommen die den selben Informationsgehalt hat.

Wenn man allerdings eine Übersicht über Objektabhängigkeiten bekommen möchte die mehr als ein Objekt betreffen bzw. die Abhängigkeiten aller Objekte eines Schemas, oder aller Objekte die dem Namensmuster “USP%” entsprechen …. ? Mehr…

KategorienSQL-Server 2005

Endlich ein Inhaltsverzeichnis

1. Juli 2009 admin Keine Kommentare

Nachdem ich jetzt selbst schon bald nicht mehr durchgeblickt habe, welche Artikel denn schon auf dieser Seite publiziert wurden, war es an der Zeit ein Inhaltsverzeichnis zu erstellen.

Dieses Verzeichnis lässt sich über die Sidebar unter dem Stichwort SQL Server Tips und Tricks aufrufen.

Ich werde versuchen, alle neuen Artikel hier auch aktuell einzustellen.

bis dahin

have fun

:-)

KategorienAllgemein

Textsuche in allen Tabellen der Datenbank

30. Juni 2009 admin Keine Kommentare

Nachdem ich ja bereits einige Scripte

für die Suche nach Objekten in einer Datenbank an dieser Stelle veröffentlicht habe, möchte ich heute abschließend eine Möglichkeit der Textsuche über alle Tabellen einer Datenbank vorstellen.

Das Script erwartet einen Suchstring und versucht dann das Wort in einer der Tabellenspalten der Datenbank zu finden. Als Wort wird hier ein Text definiert, der als Begrenzer alle Zeichen außer den folgenden aufweisen darf:

  • a-z
  • A-Z
  • 0-9
  • den Unterstrich (_)

Mehr…

KategorienSQL-Server 2005

Wordpress Plugin: Dragon’s Print-Hint

23. Juni 2009 admin 10 Kommentare

Ein Freund und Kollege (Presseschauer) bat mich, ob ich vielleicht ein Plugin schreiben könnte mit dem man einen Hinweis-Text beim Ausdruck seiner Blogseiten hinzufügen könnte.

Das Ergebnis ist “Dragon’s Print-Hint”. Das Plugin kann hierhier “http://wordpress.org/extend/plugins/dragons-printhint/” heruntergeladen werden und läßt sich durch einfaches Entpacken in das Pluginverzeichnis installieren. In den Einstellungen findet man nach der Aktivierung einen Menüpunkt mit dem der Text für den Hinweis angegeben werden kann.

Mehr…

KategorienWordpress

T-SQL: Kommentare aus Scripts entfernen

22. Juni 2009 admin Keine Kommentare

Um eine Datenbank nach Objekten zu durchsuchen die einen vorgegebenen String enthalten muss man nur durch die System-View sys.sql_modules parsen. Hier steht im Feld “Definitions” der Quelltext von Funktionen, Prozeduren oder Views.

 T-SQL |  copy code |? 
1
SELECT OBJECT_ID,definition FROM sys.sql_modules WHERE definition like '%[^a-zA-Z0-9_]Contact[^a-zA-Z0-9_]%'
2

Allerdings hat dieses einfache Verfahren einen Nachteil. Wenn der Quellcode sehr gut dokumentiert ist bzw. durch andere Vorgaben viele Kommentarbereiche enthalten sind, kann das Ergebnis eine ganze Menge an Treffern anzeigen die man so vielleicht gar nicht haben wollte.

Um also diese Kommentare aus den Quelltexten (weitestgehend) zu entfernen, habe ich eine scalar Funktion geschrieben die dies bei einer Abfrage direkt erledigen kann. Der Rest des Quellcodes kann man dann nach dem gewünschten Begriff durchsuchen und erhält so hoffentlich eine aussagekräftigere Ergebnismenge.

Mehr…

KategorienSQL-Server 2005

SQL Server 2005 – ShowStatistics über den gesamten Server

19. Juni 2009 admin Keine Kommentare

Wenn man die Statistiken einer Tabelle in SQL-Server überprüfen möchte so kann man dies mit dem Befehl: DBCC ShowStatistics erreichen. 
In unserem Fall war nur von Interesse ob die Statistiken für eine bestimmte Tabelle noch aktuell sind.

 T-SQL |  copy code |? 
1
 DBCC SHOW_STATISTICS ('Person.Address', AK_Address_rowguid) WITH NO_INFOMSGS, STAT_HEADER;
2

 

Wenn man daß allerdings über eine komplette Datenbank machen möchte oder gar über einen ganzen Server, dann hat man schon einiges zu tun.
Desweiteren wird einem zwar das Ergebnis angezeigt, vielleicht will man aber einen schicken Bericht für seinen Chef ausgeben? usw.

Wie auch immer, nachfolgend habe ich einmal eine Stored-Procedure eingestellt, die über einen Parameter eine bestimmte Menge an Datenbanken (mit SQL-Wildcards) übergeben bekommt und daraufhin alle Objekte in diese(r/n) Datenbank(en) ausgibt.

Das Ergebnis kann dann in eine Temp-Tabelle kopiert und z.B. mit einem Bericht ausgegeben werden.

Wie ein Prozedur-Ergebnis in eine Tabelle geschrieben wird, habe ich an früherer Stelle ja bereits beschrieben. 

Mehr…

KategorienSQL-Server 2005