Alex Schatten, IT Consult & Software Developement

Hier veröffentliche ich in unregelmäßigen Abständen Scriptausschnitte die für meine Arbeit "usefull" waren. Es sind Codeschnipsel die ich bei meiner Arbeit gefunden und weiterentwickelt habe. Bei Fragen zu den Scripts einfach eine kurze mail an mich.

TSQL: Alle einem Parent zugeordneten Childs finden.

Wie oft steht man vor dem Problem in einer Tabelle mit vielen Child-Verknüpfungen schnell alle untergeordneten Nodes zu finden. Seit SQL Server 2005 ist das hier ein ziemlich cooles Script. Mit dieser Function geht es wirklich schnell und sie ist sehr gut einsetzbar.

SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO

ALTER Function [dbo].[sub_NODEs] (@PARENT INT)
RETURNS @rtnTable TABLE
   (IDs INT)
/* Rekursives Abfragen Aller Childs/Nodes
   SELECT * FROM sub_NODEs(100)
*/
AS
BEGIN
   DECLARE @myID INT

   SELECT    @myID = @PARENT ;
   WITH myList(ID , Parent, item ) AS 
       ( SELECT ID , Parent , Item
       FROM NODE_TABLE
       WHERE ID = @myID
       UNION ALL
       SELECT o.ID, o.Parent, o.Item
          FROM NODE_TABLE AS o
          INNER JOIN myList
          ON  o.parent = myList.ID )

   INSERT INTO @rtnTable       
   SELECT ID
   FROM myList
   RETURN
END

TSQL: Querstellen/concatenieren von Feldwerten

Gegentlich steht man vor dem Problen das Daten eine Feldes concateniert werden sollen.
Hierzu mein kleines Script in TSQL. Als erstes erstellen wir die Tabelle nyTest und füllen sie mit ein paar Werten  


CREATE TABLE myTest ( textField VARCHAR(20) ) GO INSERT INTO myTest (textField)
SELECT 'Das ' UNION SELECT 'ist ' UNION SELECT 'ein ' UNION SELECT 'Test.'
 

Nun kommt der eigentlich Kniff. Wir definieren die Variable @myTest.
Diese binden wir dann in die Abfrage der Tabelle ein indem wir alle Datensätze abfragen und hierdurch jedesmal das Feld an die Variable anfügen. Zum Schluß kann man das Ergebniss bequem mit einem SELECT abfrage. Voila.


DECLARE @myVar VARCHAR(200) 
SET @myVar = '' SELECT @myVar = @myVar + textField FROM myTest 
SELECT @myVar 

TSQL: Finden von Lücken in fortlaufender ID oder Autowert

Eigentlich ein Klassiker in jeder FAQ zu DBs diese Frage.
Wird bei mir des öfteren in Errorlogs verwendet un tägliche Imports von Fremdsystemen zu überprüfen die fortlaufende Datensätze liefern sollen.
Auch hier ein kleines Script in TSQL. Als erstes erstellen wir die temporäre Tabelle #tmpTable und füllen sie mit paar IDs und 2 Lücken.  

CREATE TABLE #tmpTable
(
 ID INT NOT NULL
)

INSERT INTO #tmpTable VALUES (1)
INSERT INTO #tmpTable VALUES (3)
INSERT INTO #tmpTable VALUES (4)
INSERT INTO #tmpTable VALUES (7)
INSERT INTO #tmpTable VALUES (8)

                                       

Dann fragen wir einfach die Tabelle ab mit einmal der aktuellen ID und der kleinsten nachfolgenden ID in einem Subquery. Wir joinen das ganze mit einem LEFT JOIN auf den nächsten um 1 größeren Wert und überprüfen ob dieser Wert nicht NULL ist und auch nicht größer als der größte in der Tabelle vorhandene Wert.
Und das war es auch schon.

SELECT DISTINCT 'Lücke zwischen ' + CONVERT(VARCHAR, l.ID) +
	+ ' und ' +
	(SELECT CONVERT(VARCHAR, MIN(ID)) FROM #tmpTable WHERE ID > l.ID)
FROM #tmpTable l LEFT JOIN 
	(SELECT ID FROM #tmpTable ) r on l.ID + 1 = r.ID
	WHERE r.ID IS NULL AND l.ID < (SELECT MAX(ID) FROM #tmpTable)

'***Das Ergebniss   
----------------------
Lücke zwischen 1 und 3
Lücke zwischen 4 und 7