Achtung – Urheberrechtshinweis!
Die Artikel dieses Blogs stehen unter einer CREATIVE COMMONS LICENSE! Bitte beachten Sie die entsprechenden Hinweise auf http://creativecommons.org/licenses/by-sa/2.0/de/
Bei Fragen oder Anregungen wenden Sie sich bitte an blog {at} fourdragons(.)de
Der TeamFoundationServer von Microsoft integriert sich sehr gut in Visual Studio. Diese Versions/Change/Bug…-Verwaltung ist in vielen Entwicklungsabteilungen im Einsatz.
Leider sind die beiliegenden Berichte in vielen Fällen nicht ausreichend, um die individuellen Anforderungen vieler Kunden zu berücksichtigen.
Eigene bzw. angepasste Berichte müssen also erstellt werden. Um die Einarbeitung in das Thema “Bericht mit TeamFoundationServer” zu erleichtern, möchte ich hier eine Linkliste zeigen die ich auf einer Website gefunden habe.
Hier wimmelt es geradezu von Links zu allen möglichen Facetten des TFS, SSRS (Reporting Services) sowie sogar MDX.
Mehr…
Achtung – Urheberrechtshinweis!
Die Artikel dieses Blogs stehen unter einer CREATIVE COMMONS LICENSE! Bitte beachten Sie die entsprechenden Hinweise auf http://creativecommons.org/licenses/by-sa/2.0/de/
Bei Fragen oder Anregungen wenden Sie sich bitte an blog {at} fourdragons(.)de
Bei der Entwicklung von T-SQL-Scripten kommt es häufig vor dass Werte mittels String-Operationen (Zeichenkettenverarbeitung) verarbeitet werden müssen. Ob wir einen FullName aus Vorname und Nachname zusammenbauen müssen oder ein Stück dynamisches SQL erstellen, immer wieder muss der gute alte Stringverkettungsoperator (+) verwendet werden.
Ein interessantes Phänomen ist jetzt allerdings in einem laufenden Projekt aufgetreten. Hier werden sehr intensiv Stringverkettungen verwendet um zur Laufzeit dynamisches SQL zu generieren. Die resultierenden Texte sind zum Teil mehrere hundert Zeilen lang und überschreiten damit häufig die normale Maximallänge des varchar/nvarchar-Datentyps. (VarChar: 8000 Zeichen, NVarChar: 4000 Zeichen)
Die Lösung bietet SQL-Server ab der Version 2005 mit dem Datentyp (n)varchar(MAX). Hier können sehr große Inhalte hinterlegt werden (2^31-1 Bytes)!
Wenn es also ein SQL-Statement zu bauen gilt, muss dies einen Aufbau besitzen der dem Nachfolgenden entspricht:
| 01 | DECLARE @Datenbank NVARCHAR(100) |
| 02 | DECLARE @Command NVARCHAR(MAX) |
| 03 | |
| 04 | SET @Datenbank = N'AdventureWorks' |
| 05 | |
| 06 | SET @Command = N'Use ' + @Datenbank + '; |
| 07 | Select Feld1, Feld2 from MyTable; ' + |
| 08 | N'--Weitere 10000 Zeichen' |
| 09 | |
| 10 | -- Bitte die N-Präfixe bei den Strings unbedingt beachten! |
Es muss darauf geachtet werden dass alle Teilstrings im Unicode-Format mit N’…’ angegeben werden. Wenn dies nicht eingehalten wird und einer der Teilstrings ist länger als 4000 Zeichen, ist das Ergebnis des gesamten Ausdrucks ein String mit 4000 Zeichen Länge! Das bedeutet im optimalen Fall einen Syntax-Error zur Laufzeit weil ein Statement irgendwo in der Mitte abgeschnitten wird. Es kann aber auch ohne Fehler ablaufen wenn die Trennung zufällig an einer Stelle auftritt die zwischen zwei Statements oder innerhalb eines Kommentars liegt!
Das oben beschriebene Verhalten ist unabhängig vom Variablentyp (nvarchar, varchar, max oder nicht …)!
have fun
Achtung – Urheberrechtshinweis!
Die Artikel dieses Blogs stehen unter einer CREATIVE COMMONS LICENSE! Bitte beachten Sie die entsprechenden Hinweise auf http://creativecommons.org/licenses/by-sa/2.0/de/
Bei Fragen oder Anregungen wenden Sie sich bitte an blog {at} fourdragons(.)de
Wenn man in SSIS eine Datenquelle verwendet so ist dies in den meisten Fällen eine Tabelle, View oder ein Select-Statement. Es kommt aber vor dass man ab und zu keine Datenquelle im klassischen Sinn vorfindet. Hier kann eine Stored Procedure Abhilfe schaffen die ein Result-Set zurückliefert, dass danach als Quelle für die weitere Verarbeitung dient.
Das Problem bei einer Stored Procedure besteht darin dass die Metadaten nur mit einem Workaround von SSIS automatisch eingelesen werden. Wie dies zu bewerkstelligen ist soll dieser Artikel kurz beschreiben.
Mehr…
Achtung – Urheberrechtshinweis!
Die Artikel dieses Blogs stehen unter einer CREATIVE COMMONS LICENSE! Bitte beachten Sie die entsprechenden Hinweise auf http://creativecommons.org/licenses/by-sa/2.0/de/
Bei Fragen oder Anregungen wenden Sie sich bitte an blog {at} fourdragons(.)de
Ein kleines Script als Table-Values-Function dass für eine Tabelle oder ein Feld den Datentype zurückgibt:
| 01 | CREATE FUNCTION tvf_GetFieldTypes(@SchemaName sysname,@TabellenName sysname,@Feldname sysname) |
| 02 | RETURNS TABLE AS RETURN |
| 03 | SELECT s.name AS SchemaName |
| 04 | ,o.name AS TabellenName |
| 05 | ,c.name AS FeldName |
| 06 | ,t.name + |
| 07 | CASE t.name |
| 08 | WHEN 'real' THEN '(' + CAST(c.PRECISION AS VARCHAR(10)) + ')' |
| 09 | |
| 10 | WHEN 'varbinary' THEN '(' + CAST(c.max_length AS VARCHAR(10)) + ')' |
| 11 | WHEN 'binary' THEN '(' + CAST(c.max_length AS VARCHAR(10)) + ')' |
| 12 | WHEN 'varchar' THEN '(' + CAST(c.max_length AS VARCHAR(10)) + ')' |
| 13 | WHEN 'char' THEN '(' + CAST(c.max_length AS VARCHAR(10)) + ')' |
| 14 | WHEN 'nvarchar' THEN '(' + CAST(c.max_length/2 AS VARCHAR(10)) + ')' |
| 15 | WHEN 'nchar' THEN '(' + CAST(c.max_length/2 AS VARCHAR(10)) + ')' |
| 16 | |
| 17 | WHEN 'numeric' THEN '(' + CAST(c.PRECISION AS VARCHAR(10)) + ',' + |
| 18 | CAST(c.scale AS VARCHAR(10)) + ')' |
| 19 | WHEN 'decimal' THEN '(' + CAST(c.PRECISION AS VARCHAR(10)) + ',' + |
| 20 | CAST(c.scale AS VARCHAR(10)) + ')' |
| 21 | WHEN 'money' THEN '(' + CAST(c.PRECISION AS VARCHAR(10)) + ',' + |
| 22 | CAST(c.scale AS VARCHAR(10)) + ')' |
| 23 | WHEN 'smallmoney' THEN '(' + CAST(c.PRECISION AS VARCHAR(10)) + ',' + |
| 24 | CAST(c.scale AS VARCHAR(10)) + ')' |
| 25 | ELSE '' |
| 26 | END AS FeldTyp |
| 27 | ,CASE c.is_nullable WHEN 0 THEN 'NOT NULL' ELSE 'NULL' END AS Nullable |
| 28 | |
| 29 | FROM sys.objects o |
| 30 | join sys.schemas s ON s.schema_id = o.schema_id |
| 31 | join sys.columns c ON c.OBJECT_ID = o.OBJECT_ID |
| 32 | join sys.types t ON t.system_type_id = c.system_type_id |
| 33 | WHERE o.name like '%' + @TabellenName + '%' |
| 34 | and s.name like '%' + @SchemaName + '%' |
| 35 | and c.name like '%' + @Feldname + '%' |
| 36 | and t.system_type_id = t.user_type_id |
| 37 | go |
| 38 | |
| 39 | SELECT * FROM tvf_GetFieldTypes('Person','Co','') |
| 40 | |
und hier die Ausgabe:
Ergebnis
| SchemaName |
TabellenName |
FeldName |
FeldTyp |
Nullable |
| Person |
Contact |
ContactID |
int |
NOT NULL |
| Person |
Contact |
NameStyle |
bit |
NOT NULL |
| Person |
Contact |
Title |
nvarchar(8) |
NULL |
| Person |
Contact |
FirstName |
nvarchar(50) |
NOT NULL |
| Person |
Contact |
MiddleName |
nvarchar(50) |
NULL |
| Person |
Contact |
LastName |
nvarchar(50) |
NOT NULL |
| Person |
Contact |
Suffix |
nvarchar(10) |
NULL |
| Person |
Contact |
EmailAddress |
nvarchar(50) |
NULL |
| Person |
Contact |
EmailPromotion |
int |
NOT NULL |
have fun
Achtung – Urheberrechtshinweis!
Die Artikel dieses Blogs stehen unter einer CREATIVE COMMONS LICENSE! Bitte beachten Sie die entsprechenden Hinweise auf http://creativecommons.org/licenses/by-sa/2.0/de/
Bei Fragen oder Anregungen wenden Sie sich bitte an blog {at} fourdragons(.)de
Ein Paket das mit Visual-Studio (bzw. BI-Studio) erstellt wird, kann in einer 64-Bit-Umgebung natürlich auch getestet werden. Davon bin ich bis jetzt zumindes ausgegangen …
Mehr…