Cancel update if no columns changed
Don't think about "not calling the update statement." If you have to check the existing value in the table, you have to read the row, whether you're going to update it or not. Then, if you have to update it, you have to read the row again first. How this could possibly be more efficient than just trying to update the row is beyond me.

You can shorthand all that is null/is not null syntax if you can pick a string that can't possibly be a valid name:

UPDATE dbo.students
  SET [Name] = @Name
  WHERE StudentId = @StudentId
  AND ( COALESCE(Name, N'한') &lt;&gt; COALESCE(@Name, N'한') );
  -----------------------^ obscure character that can't be a valid name


Otherwise:

UPDATE dbo.students
  SET [Name] = @Name
  WHERE StudentId = @StudentId
  AND 
  (
        Name &lt;&gt; @Name
        OR ( Name IS NOT NULL AND @Name IS NULL )
        OR ( Name IS NULL AND @Name IS NOT NULL )
  );


If it really is a hard requirement to not fire the UDPATE if it will affect 0 rows, then you need to take a less efficient path and locate the row twice when the update is going to affect a row.

BEGIN TRANSACTION;

IF EXISTS 
(
  SELECT 1 FROM dbo.students WITH (UPDLOCK, HOLDLOCK)
  WHERE StudentId = @StudentId 
    AND 
    (
      Name &lt;&gt; @Name
      OR ( Name IS NOT NULL AND @Name IS NULL )
      OR ( Name IS NULL AND @Name IS NOT NULL )
    )
)
BEGIN
  UPDATE dbo.students 
  SET Name = @Name 
  WHERE StudentId = @StudentId 
    AND 
    (
      Name &lt;&gt; @Name
      OR ( Name IS NOT NULL AND @Name IS NULL )
      OR ( Name IS NULL AND @Name IS NOT NULL )
    );
END

COMMIT TRANSACTION;