• USE [tempdb]

    GO

    --== TEST DATA ==--

    IF OBJECT_ID('dbo.UserDetails') IS NOT NULL DROP TABLE dbo.UserDetails

    CREATE TABLE dbo.UserDetails

    (

    StaffNumber Varchar(30),

    Name Varchar(30),

    UserEmail Varchar(50) NULL

    )

    INSERT INTO dbo.UserDetails

    (StaffNumber, Name, UserEmail)

    VALUES

    ('A111116', 'Fred Smith', 'user1@email.com'),

    ('B22371', 'Jan Richards', NULL),

    ('X06742198', 'Anne Spencer', 'annespencer@email.com'),

    ('B43521', 'John James', 'jj-invalid')

    SELECT * FROM dbo.UserDetails

    --== CREATE VIEW ==--

    -- It's best to run this code command-by-command from here, to see what's happening:

    IF OBJECT_ID('dbo.View1') IS NOT NULL DROP VIEW dbo.View1

    GO

    -- This view doesn't handle invalid email addresses (NULL is OK):

    CREATE VIEW dbo.View1 AS

    SELECT *,

    [NewColumn]=LEFT(UserEmail, CHARINDEX('@', UserEmail, 1) -1)

    FROM dbo.UserDetails

    GO

    -- This fails:

    SELECT * FROM dbo.View1

    GO

    -- Handle invalid data:

    ALTER VIEW dbo.View1 AS

    SELECT *,

    [NewColumn]=CASE WHEN CHARINDEX('@', UserEmail, 1)=0 THEN UserEmail ELSE LEFT(UserEmail, CHARINDEX('@', UserEmail, 1) -1) END

    FROM dbo.UserDetails

    GO

    -- And it works...

    SELECT * FROM dbo.View1

    -- ... but you may want to handle missing/invalid data differently.