Kann man immer wieder mal brauchen: Eine Split-Funktion für MSSQL (ab 2000).
CREATE FUNCTION [dbo].[udf_ItemExtract]
(
@Position INTEGER,
@List VARCHAR(2000), --VARCHAR(MAX)
@Delimiter VARCHAR(1)
)
RETURNS VARCHAR(2000) --VARCHAR(MAX)
AS
BEGIN
DECLARE @RetVal VARCHAR(2000) SET @RetVal = '' --VARCHAR(MAX)
DECLARE @Counter INT SET @Counter = 0
DECLARE @StartPos INT
DECLARE @Length INT
DECLARE @DelimPos INT SET @DelimPos = 0
-- SCAN THROUGH UNTIL WE FIND THE ITEM AT THE POSITION OF THE INDEX - WE'LL GO THROUGH WHILE LOOP AT LEAST ONCE
WHILE @Counter < @Position
BEGIN
SET @Counter = @Counter + 1 -- increment counter
SET @StartPos = @DelimPos + 1 -- move the start position to right after previously found delimiter (or 1st char if this is the fist time through
SET @DelimPos = CHARINDEX(@Delimiter,@List,@DelimPos + 1) --find the next delimiter
-- IF THERE ARE NO DELIMITERS LEFT...
IF @DelimPos = 0
BEGIN
-- IF WE'RE ON THE POSITION WE'RE LOOKING FOR, THEN SET LENGTH TO THE REST OF THE STRING
IF @Counter = @Position SET @Length = (LEN(@List)+1)-@StartPos
-- OTHERWISE SET LENGTH TO -1 AND THAT WILL BE AN INDICATOR TO RETURN EMPTY STRING
ELSE SET @Length = -1
END
ELSE SET @Length = @DelimPos - @StartPos -- otherwise length is now from new start pos right up to delimiter
END
-- RETURN THE EXTRACTED STRING
IF @Length > 0 SET @RetVal = SUBSTRING(@List,@StartPos,@Length)
RETURN @RetVal
END
Newsfeeds können sehr praktisch sein. Schon mal an eine Interaktion von Feed <-> System Management Server oder Feed <-> Domain gedacht?
Ein praktisches Beispiel:
In einem Unternehmen werden regelmäßig Systemhotfixe, Systemupdates, Application Updates etc. verteilt. Dabei sollen die User aber vorher informiert werden damit sie wissen, das ein Update zur Installation ansteht oder das die Performance kurzfristig beeinträchtigt werden kann.
In der Regel gehen dann ellenlange Mails mit (für den User) unverständlichen Informationen durch das Unternehmen.
Man könnte aber auch einen (oder mehrere) zentrale(n) Newsfeed(s) anbieten. Einen für Hotfixe, noch einen für Office-Patches oder auch einen für Updates einer spezifischen Software (Visual Studio meinetwegen).
Großes Gerede, aber was brauchen wir?
Wie benötigen ein wenig ASP.Net 2 Webspace. Wenn vorhanden noch eine SQL-Datenbank, es reicht aber auch wenn man eine Access-Datenbank nutzt.
Dort legt man 2 Tabellen an:
CREATE TABLE Channels (
[id] [int] IDENTITY(1,1) NOT NULL,
[title] [nvarchar](255) NULL,
[description] [ntext] NULL,
[managingeditor] [nvarchar](50) NULL,
[webmaster] [nvarchar](50) NULL);
CREATE TABLE Items(
[id] [int] IDENTITY(1,1) NOT NULL,
[title] [nvarchar](255) NULL,
[description] [ntext] NULL,
[pubdate] [datetime] NULL,
[author] [nvarchar](50) NULL,
[channel] [int] NULL,
[published] [bit] NULL DEFAULT ((0)),
[targetou] [ntext] NULL,
[smscollection] [nvarchar](50) NULL,
[clientlist] [ntext] NULL);
Die Tabellennamen sind selbsterklärend: Channels für die verfügbaren Feeds und Items für alle Nachrichten. Bei der Tabelle Items habe ich 3 Spalten um die Nachrichten genauer zu Verteilen:
In “targetou” kann ein spezifischer LDAP-String eingetragen werden, sodass später nur Clients die Nachricht bekommen die auch Mitglied der OU sind. Gleiches gilt für “smscollection”. Eine eingetragene Collection aus SMS stellt sicher, das nur Clients die in der Collection sind die Nachricht erhalten. Und die Spalte “clientlist” ist für spezifische Rechnerlisten. Dort sollen Semikolonseparierte FQDN-Namen von Rechnern eingetragen werden die die Nachricht erhalten sollen (z.B. zur Definition von Testfeldern).
Continue reading ‘ASP.NET 2 in 30 minutes: Feeds made simple’