Es gibt zwei Formen von APPLY: CROSS APPLY und OUTER APPLY.
CROSS APPLY gibt nur Zeilen von der äußeren Tabelle zurück, die ein Resultset der Tabellenwertfunktion erstellen.
OUTER APPLY gibt sowohl Zeilen, die ein Resultset erstellen als auch solche Zeilen zurück, bei denen dies nicht der Fall ist.
Durch die Tabellenwertfunktion werden hierbei in den Spalten NULL-Werte erstellt.
SELECT emails.[ID], s.[Username], s.[Domain] FROM [emails] CROSS APPLY [EmailParse](emails.[EmailAddress]) s CREATE FUNCTION EmailParse (@email varchar(1000)) RETURNS @t TABLE ([UserName] varchar(20), [Domain] varchar(20)) AS BEGIN DECLARE @i int SET @i = charindex('@', @email, 1) IF (@i > 1) INSERT INTO @t VALUES (LEFT(@email, @i-1), SUBSTRING(@email, @i+1, 20)) ELSE INSERT INTO @t VALUES (null,null) RETURN END