Monthly Archive for August, 2008

Abgeschnittene Strings

Ein anderes interessantes Phänomen lief mir gerade über den Weg: Liest man aus einem SQL Server eine richtig lange Zeichenkette (z.B. mehr als 2000 Zeichen, z.B. mit einer ‘FOR XML …’ Transformation im Select) wird einem das Ergebnis willkürlich bei um die 1000 Zeichen abgeschitten.
Eine generelle Workaroundfunktion ist schnell gebastelt:

Private Shared Function GetLongStringData(ByVal statement As String) As String
	Dim sql As New System.Data.SqlClient.SqlCommand()
	Dim con As New System.Data.SqlClient.SqlConnection()
	con.ConnectionString = "connectionstring"
	sql.CommandText = statement
	sql.Connection = con
	con.Open()
	Dim r As System.Data.SqlClient.SqlDataReader = sql.ExecuteReader()
	Dim strbuilder As New StringBuilder()
	While r.Read()
		strbuilder.Append(r(0))
	End While
	con.Close()
	Return strbuilder.ToString()
End Function

Stellt sich allerdings nach wie vor die Frage warum die Daten abgeschnitten werden. Im SQL Server Management Studio wird alles korrekt angezeigt. Ich vermute das Problem liegt irgendwo bei der Übergabe vom SQL Server in den .Net String. Wenn jemand eine Idee hat, möge er sich bei mir melden. :)

Case und Linked Server

Wer mal folgendes versucht:

select
	(case
		when bedingung1 then
			(case
				when bedingung2 then statement2
				when bedingung3 then statement3
				when bedingung4 then statement4
				when bedingung5 then statement5
				when bedingung6 then statement6
				when bedingung7 then statement7
				when bedingung8 then statement8
				when bedingung9 then statement9
				when bedingung10 then statement10
				when bedingung11 then statement11
				else statement12
			end)
		else statement1
		end)
from linked_server.database.schema.table

wird feststellen, das einem der SQL Server eine Fehlermeldung bringt:

Meldung 8180, Ebene 16, Status 1, Zeile 1
Statement(s) could not be prepared.
Meldung 125, Ebene 15, Status 4, Zeile 1
Case expressions may only be nested to level 10.

Leider findet man hierzu nichts in der MSDN und auch sonst im Web wurde ich nicht fündig um diesen Fehler zu beheben. Wobei die Ursache relativ simpel ist, und die Fehlermeldung einen schon drauf hinweist: Case Statements dürfen über eine Linked-Server Verbindung nur bis maximal 10 Schachtelungen haben.

So einen Hinweis hätte ich eigentlich in der MSDN erwartet!

Das kann man auch nicht durch irgendwelche Einstellungen am Linked Server ändern. Da hilft nur eine Behelfsview in der Quelldatenbank. Dann kann man auch fröhlich und mit einer Erfahrung mehr die Datenmigration fortsetzen.

“Cannot find template with ID (TestType) for CSharp test project”

Diese Fehlermeldungen haben mich heute beim Erstellen eines neuen Testprojektes erwischt:

“Cannot find template with ID TestProject-V1-SimpleUnitTest for CSharp test project”
“Cannot find template with ID TestProject-V1-WordManualTest for CSharp test project”
“Cannot find template with ID TestProject-V1-HelpTest for CSharp test project”

Nicht grade praktisch, wenn man sich gerade in Test Driven Development einarbeitet. Die Ursache dieser Fehler ist recht banal. Die eingestellte Sprache im Visual Studio ist Deutsch. Nun hat Microsoft allerdings die Testprojektvorlagen nur für Englisch bereitgestellt. Man muss also in den Internationalen Einstellungen vom Visual Studio die Sprache auf Englisch umstellen.

Wenn man unter %Program Files%\Microsoft Visual Studio 9.0\Common7\IDE\ItemTemplates\Test nachschaut, gibt es lediglich einen Ordner “1033″ welcher die LanguageID für Englisch ist (en-US). Leider hilft auch ein manuellen Anlegen eines Ordners und kopieren der Itemtemplates für die deutsche Sprache (1031) nichts, es treten auch dann noch Fehlermeldungen auf.

SQL Server Management Studio Tips & Tricks

#1: Möchte man das SSMS 2008 mit einer früheren Version des SQL Servers nutzen, sollte man in den Optionen die Serverversion für die Skripterstellung anpassen.


#2: Wenn man schon dabei ist die Scriptversion zu ändern, sollte man auch gleich die Option “IF NOT EXISTS-Klausel einschließen” aktivieren. Dadurch wird den automatisch erstellten Create-Scripten die Prüfung hinzugefügt ob das Objekt schon existiert.
#3: Und am besten gleich noch die Option “Scripterstellung für Trigger” auf “True” setzen um bei Tabellen automatisch die Trigger mit scripten zu lassen.