SQL formatting may not increase the functionality of the code but good and consistent formatting by the developers certainly affect the readability of the code and therefore makes it easier to maintain. Keyword and separator alignment, spaces and tabs provide opportunities for a lot of variations in code layout. A case-insensitive server/database give further flexibility in formatting with choosing upper or lower casing of the text.
Just as an experiment to see the effect of casing and object naming conventions on readability, I created this dummy stored procedure and formatted it in four different ways. The white-space layout, i.e. tabs, spaces, newline etc is same in all of them.
Which one do you prefer?
Do you have your own layout options that you would like to share?
Feel free to copy the script and share your formatted version in comments.
Version 1
-- underscore as word separator
-- lowercase keywords
create procedure dbo.sp_get_employee
@employee_id int,
@department_id int
as
begin
select
e.first_name,
e.last_name,
e.designation,
e.salary,
e.manager_first_name,
e.manager_last_name,
d.department_name
from
dbo.employee as e with (nolock)
inner join dbo.department as d with (nolock)
on e.department_id = d.department_id
where
employee_id = @employee_id and
department_id = @department_id;
return 0;
end
Version 2
-- underscore as word separator
-- UPPERCASE keywords
CREATE PROCEDURE dbo.sp_get_employee
@employee_id INT,
@department_id INT
AS
BEGIN
SELECT
e.first_name,
e.last_name,
e.designation,
e.salary,
e.manager_first_name,
e.manager_last_name,
d.department_name
FROM
dbo.employee AS e WITH (NOLOCK)
INNER JOIN dbo.department AS d WITH (NOLOCK)
ON e.department_id = d.department_id
WHERE
employee_id = @employee_id AND
department_id = @department_id;
RETURN 0;
END
Version 3
-- camel/pascal casing for objects names
-- lowercase keywords
create procedure dbo.spGetEmployee
@EmployeeId int,
@DepartmentId int
as
begin
select
e.FirstName,
e.LastName,
e.Designation,
e.Salary,
e.ManagerFirstName,
e.ManagerLastName,
d.DepartmentName
from
dbo.Employee as e with (nolock)
inner join dbo.Department as d with (nolock)
on e.DepartmentId = d.DepartmentId
where
EmployeeId = @EmployeeId and
DepartmentId = @DepartmentId;
return 0;
end
Version 4
-- camel/pascal casing for objects names
-- UPPERCASE keywords
CREATE PROCEDURE dbo.spGetEmployee
@EmployeeId INT,
@DepartmentId INT
AS
BEGIN
SELECT
e.FirstName,
e.LastName,
e.Designation,
e.Salary,
e.ManagerFirstName,
e.ManagerLastName,
d.DepartmentName
FROM
dbo.Employee AS e WITH (NOLOCK)
INNER JOIN dbo.Department AS d WITH (NOLOCK)
ON e.DepartmentId = d.DepartmentId
WHERE
EmployeeId = @EmployeeId AND
DepartmentId = @DepartmentId;
RETURN 0;
END