Archive for July, 2009
Excel Macros zum entfernen von zeilenumbrüchen, nutzlosen Leerzeichen etc

Nachdem ich in den letzten Tagen einen Teil meiner SQL Scripts veröffentlicht habe, mache ich jetzt mal mit ein paar Macros weiter. Die nachfolgend aufgeführten Macros sind für Excel bestimmt und sollen einem Admin helfen Daten für die Weiterverarbeitung z. B. mit S-Verweisen (v-lookups) oder für den Upload in eine Datenbank aufzubereiten.

Diese Funktion entfernt Zeilenumbrüche aus dem markierten Bereich:

Sub entfernen_zeilenumbrueche()
Dim c As Object
For Each c In Selection
c.Value = Replace(c.Value, Chr(10), "")
Next
End Sub

Diese Funktion wandelt im markierten Bereich Zeilenumbrüche in RTF Zeilenumbrüche (\par) um:

Sub zeilenumbrueche2rtf()
Dim c As Object
For Each c In Selection
c.Value = Replace(c.Value, Chr(10), "\par")
c.Value = Replace(c.Value, Chr(11), "\par")
c.Value = Replace(c.Value, Chr(13), "\par")
Next
End Sub

Diese Funktion ersetzt etwas ausergewöhnliche Hochkommas durch “normale” im markierten Bereich:

Sub replace_strange_chars()
Dim c As Object
For Each c In Selection
'Entfernen von komischen Hochkommas
c.Value = Replace(c.Value, Chr(191), Chr(39))
Next
End Sub

Wie der Name sagt, werden hier ein paar Sonderzeichen für einen Upload in eine MSSQL Datenbank escaped (im markierten Bereich):

Sub escape_mssql_string()
Dim c As Object
For Each c In Selection
'Escapen von Hochkommas
c.Value = Replace(c.Value, Chr(39), Chr(39) + Chr(39))
Next
End Sub

Sehr sehr nützliche Funktion. Im markierten Bereich werden alle Leerzeichen am Anfang und am Ende eines Strings entfernt. Leerzeichen im Text werden nicht entfernt:

Sub remove_useless_spaces()
Dim c As Object
For Each c In Selection
c.Value = Application.WorksheetFunction.Clean(Trim(c.Value))
Next
End Sub

Viel Spass mit den Funktionen

MSSQL String in RTF wandeln

… und noch eine SQL Funktion aus meiner Sammlung. Diese Funktion ermöglicht das Umwandeln eines normalen Strings in ein RTF “Objekt” direkt auf der Datenbank.

-- Diese SQL Query erstellt eine neue Funktion mit dem Namen string2rtf. Die Funktion hat zur Aufgabe einen übergebenen String
-- in ein RTF Objekt umzuwandeln.
-- @param String enthält den Rohstring
-- @return rtfstring enthält den string plus die rtf Erweiterungen
if exists (select * from information_schema.routines where routine_name = N'string2rtf' and routine_type = 'function') drop function [dbo].[string2rtf]
GO
CREATE FUNCTION dbo.string2rtf(@string varchar(8000))
returns varchar(8000)
AS
BEGIN
DECLARE @praefix varchar(200)
DECLARE @suffix varchar(200)
DECLARE @rtfstring varchar(8000)
SET @praefix = '{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fnil\fcharset0 Microsoft Sans Serif;}}\viewkind4\uc1\pard\f0\fs17 '
SET @suffix = '\par}'
SET @rtfstring = NULL
SET @rtfstring = @praefix + @string + @suffix;
SET @rtfstring = REPLACE(@rtfstring,CHAR(9),'\tab ');
SET @rtfstring = REPLACE(@rtfstring,CHAR(13) + CHAR(10),'\par ');
SET @rtfstring = REPLACE(@rtfstring,CHAR(13),'\par ');
SET @rtfstring = REPLACE(@rtfstring,CHAR(10),'\par ');
SET @rtfstring = REPLACE(@rtfstring,'ä','\''e4');
SET @rtfstring = REPLACE(@rtfstring,'Ä','\''c4');
SET @rtfstring = REPLACE(@rtfstring,'ü','\''fc');
SET @rtfstring = REPLACE(@rtfstring,'Ü','\''dc');
SET @rtfstring = REPLACE(@rtfstring,'ö','\''f6');
SET @rtfstring = REPLACE(@rtfstring,'Ö','\''d6');
SET @rtfstring = REPLACE(@rtfstring,'ß','ss');
SET @rtfstring = REPLACE(@rtfstring,'€','\''80');
return @rtfstring
end
MSSQL Export in eine normale Datei mit create und insert statements

… was für ein Tag. Mein Plan war es heute mal schnell eine bestehende Datenbank in eine andere Datenbank zu kopieren. Von den Datenbanksystemen mit denen ich bis jetzt gearbeitet habe (MySQL und Oracle) her war ich es gewohnt, dies mit wenigen Schritten erledigen zu können.

Nicht so bei MSSQL – weder die Management Konsole für jeden (SSMSE) noch der große Bruder (SSMS) bieten eine vernüftige Funktion um die Daten einfach in ein lesbares Format zu exportieren.

Nach etwas suchen bin ich dann auf ein weiters Tool von Microsoft aufmerksam gemacht worden. Der Microsoft SQL Server Database Publishing Wizard bietet genau die von mir gewünschte Funktionalität und ist kinderleicht zu bedienen.

MSSQL Split bzw. explode function

Ich hatte die letzten Monate über das Vergnügen mein etwas eingestaubtes SQL Wissen wieder auffrischen zu dürfen. Als Folge dessen sind ein paar SQL snippets entstanden die u. U. auch jemandem anderen im Netz helfen könnten.

Als erstes möchte ich eine Funktion mit euch Teilen welche es ermöglicht einen übergebenen String anhand eines Trennzeichens zu zerlegen. Die Funktion ist sehr hilfreich wenn man Daten aus einer Datenbank ziehen muß bei der die Entwickler der Meinung waren, dass es Klug ist bestimmte Informationen einfach nur z. B. durch pipes getrennt in ein varchar Feld zu schreiben…

-- Die Funktion zerlegt einen String anhand eines Trennzeichens und gibt einen definierbaren Teilstring zurück.
-- @param String der zu zerlegenden String
-- @param Delimiter das Trennzeichen anhand dessen der String zerlegt wird
-- @param returnItem die Nummer des Objektes welches zurück gegeben werden soll
-- @return returnslice der Rückgabewert - wenn nichts gefunden wird ist dieser "Null"
-- ChangeLog:
-- 20090505: Erste Version erstellt von Johannes Schmidt (Security-Blog.eu)
if exists (select * from information_schema.routines where routine_name = N'split' and routine_type = 'function') drop function [dbo].[split]
GO
CREATE FUNCTION dbo.split(@String varchar(8000), @Delimiter varchar(12), @returnItem int)
returns varchar(8000)
AS
BEGIN
declare @id int
declare @idx int
declare @slice varchar(8000)
declare @returnslice varchar(8000)
set @id = 0
set @idx = 1
set @returnslice = null
while @idx!= 0
begin
set @id = @id + '1'
set @idx = charindex(@Delimiter,@String)
if @idx!=0
set @slice = left(@String,@idx - 1)
else
set @slice = @String
if @id = @returnItem set @returnslice = @slice
set @String = SUBSTRING(right(@String,len(@String) - @idx),len(@Delimiter) + 1, len(@String))
if len(@String) = 0 break
end
return @returnslice
end

Anwendungsbeispiel:

Select split('Ich bin ein Test', ' ', 2)

Der Rückgabewert wäre hier “bin”.

Benutzer mit unsicheren Browsern warnen

Hi!

nach durchsicht meiner Serverlogfiles ist mir aufgefallen, dass noch immer eine recht große Anzahl an Besuchern mit veralteten Browsern durchs Netz surfen.  Um die Benutzer dafür zu sensibilisieren habe ich daher eine kleine und mehr oder minder unauffällige Warnmeldung für Benutzer eines IE6 und älter implementiert.

Benutzer_alter_browser_warnen

Eine entsprechende Meldung kann man recht einfach auf seiner Webseite platzieren. Es ist dafür nur notwendig direkt nach dem <body> – tag folgenden Code einzufügen:

<!--[if lte IE 6]>
<div style="padding: 4px; background: red none repeat scroll 0% 0%; color: #000000; width: 100%;">
ACHTUNG! Sie benutzen einen veralteten Internetbrowser. Dies stellt ein
<a href="http://www.security-blog.eu/2009/07/09/benutzer-mit-unsicheren-browsern-warnen/">Sicherheitsrisiko</a>
für Sie dar. Bitte aktualisieren Sie Ihren Browser: <a href="http://www.mozilla.com">Firefox</a>,
<a href="http://www.microsoft.com/germany/windows/internet-explorer/default.aspx">InternetExpolorer 8</a>
</div>
<![endif]-->

Mir ist bewußt, dass ich damit nur Benutzer von alten IEs anspreche und veraltete Opera, Firefox oder gar Netscape Nutzer nicht warne – eine entsprechend Umfängliche Warnung hätte jedoch einen deutlich aufwändigeren Code zur Folge und laut meinem Logfile sind Benutzer dieser Browser fast immer up2date…

Da ich in der Warnmeldung auch auf diesen Beitrag verlinke noch ein paar erklärende Worte warum es so wichtig ist einen aktuellen Browser zu Benutzen. Aktuelle Browser  unterstützen die gängigen Webstandards um welten besser als es die alten Browser getan haben (da spricht der Webmaster in mir). Selbstverständlich haben ältere Browser auch mit Sicherheitsproblemen zu kämpfen die abhängig von der Version durch die Hersteller auch nicht mehr gefixed werden. Bei vielen alten Browsern kann man sich durch reines aufrufen einer infizierten Webseite einen Virus bzw. einen Trojaner einfangen. Dies geschieht vollständig ohne das zutun des Benutzers und kann sogar auf sonst vertauenswürdigen Seiten durch manipulation selbiger (z. B. durch Werbenetzwerke) geschehen. Die Ausrede “ich passe auf” zählt hier also absolut nicht. Ach ja, die ganzen neuen Browser können auch Tab-Browsing und jeder der das mal hatte will es nicht mehr her geben.

Sollte also jemand diesen Beitrag hier mit einem alten Browser (z. B. IE6) lesen – schnell updaten! :-) Hat man selber nicht die Möglichkeit, was in Unternehmen üblich ist, dann bitte den Administrator darauf hinweisen und ihn bitten den Browser auf eine sichere Version zu heben.

P. S. Ja, es ist ausdrücklich erlaubt den Code von oben zu kopieren und auf der eigenen Seite einzusetzen!