10 Best Practices for T-SQL that Every Developer Should Know

Atakan Korez
5 min readMay 14, 2023

--

T-SQL is a powerful programming language used for managing and querying relational databases. However, writing efficient and optimized T-SQL code can be challenging, especially for new developers.

In this blog, I am going to discuss 10 best practices that every T-SQL developer should know to improve their code's performance, readability, and maintainability. From proper indexing to avoiding common mistakes, these practices will help you write better T-SQL code and achieve better results in your database applications. Let’s start…

1. Avoid using SELECT * and explicitly list the columns to be returned: It’s a common bad practice to use SELECT * in T-SQL queries, as it can negatively impact performance and readability. Instead, explicitly list the columns you need in the SELECT statement, as this can help reduce unnecessary network traffic and improve query execution times.

-- Bad practice: using SELECT *
SELECT *
FROM
Customers

-- Best practice: explicitly listing columns
SELECT CustomerID,
CustomerName,
ContactName
FROM
Customers

2. Use Joins Instead of Subqueries: Use joins instead of subqueries when querying multiple tables as it can improve performance.

-- Bad Practice
SELECT order_id,
customer_name
FROM orders
WHERE customer_id= (SELECT customer_idFROM customers WHERE customer_name = 'Atakan KOREZ');

-- Good Practice
SELECT o.order_id,
c.customer_name
FROM orders o
JOIN customers cON o.customer_id = c.customer_id
WHERE c.customer_name = 'Atakan KOREZ';

3. Use Meaningful and Consistent Naming Conventions: Use descriptive and consistent names for tables, columns, stored procedures, and functions. Avoid abbreviations and use PascalCase or snake_case conventions for naming.

-- Bad Practice
CREATE TABLE T1 (
ID INT PRIMARY KEY,
Col1 VARCHAR(50) NOT NULL,
Col2 VARCHAR(50) NOT NULL,
Date1 DATE NOT NULL
);

-- Good Practice
CREATE TABLE Employee (
EmployeeID INT PRIMARY KEY,
FirstName VARCHAR(50) NOT NULL,
LastName VARCHAR(50) NOT NULL,
HireDate DATE NOT NULL
);

4. Use EXISTS instead of IN for Where Conditions: The EXISTS keyword is generally more efficient because it stops searching for matches as soon as it finds one, while the INkeyword will search through the entire subquery even if a match has already been found.

--Bad Practice
SELECT order_id,
order_name
FROM orders
WHERE customer_id IN (
SELECT customer_id
FROM customers
WHERE country = 'USA'
);

--Good Practice
SELECT o.order_id,
o.order_name
FROM orders o
WHERE EXISTS (
SELECT 1
FROM customers c
WHERE c.customer_id = o.customer_id
AND c.country = 'USA'
);

5. Use appropriate data types and lengths: This best practice advises developers to choose the most suitable data types and lengths for database columns to reduce storage requirements and improve performance.

-- Bad Practice
CREATE TABLE Customers (
PersonID INT PRIMARY KEY,
FirstName VARCHAR(MAX) NOT NULL,
LastName VARCHAR(MAX) NOT NULL,
Age INT
);

--Good Practice
CREATE TABLE Person (
PersonID int PRIMARY KEY,
FirstName VARCHAR(50)NOT NULL,
LastName VARCHAR(50)NOT NULL,
Age TINYINT
);

6. Use proper indexing to improve query performance: This is crucial for optimizing database performance. Indexing allows faster retrieval of data, reduces the amount of disk I/O, and improves query execution time.

--Creating Index
CREATE INDEX idx_orders_customer_id ON orders (customer_id);

SELECT order_id,
order_name
FROM dbo.Orders
WHERE customer_id = 1000

7. Avoid using scalar functions in WHERE clauses: Scalar functions are functions that return a single value and are often used in SQL queries for various operations. However, using scalar functions in WHERE clauses can significantly slow down the query performance. This is because the function has to be executed for each row in the table, which can be a performance bottleneck for large datasets.

-- Bad practice
SELECT customer_name
FROM customers
WHERE DATEDIFF(day, getdate(), created_at) > 30

--Good practice
DECLARE @threshold_date date = DATEADD(day, -30, GETDATE())

SELECT customer_name
FROM customers
WHERE created_at < @threshold_date

8. Avoid Using Dynamic SQL Queries: Dynamic SQL Queries refer to the practice of constructing SQL statements at runtime using string manipulation techniques. While it offers a great deal of flexibility and allows for dynamic queries, it can also introduce a host of issues and security vulnerabilities.

-- Bad practice
DECLARE @sql NVARCHAR(MAX) = N'SELECT customer_id, customer_name FROM customers'

IF @searchTerm IS NOT NULL
SET @sql += N' WHERE name LIKE ''' + @searchTerm + '%'''

EXEC(@sql)

-- Good practice
DECLARE @city NVARCHAR(50) = 'Los Angeles'
DECLARE @sql NVARCHAR(MAX)

SET @sql = N'SELECT customer_id, customer_name FROM customers WHERE city = @city'
EXEC sp_executesql @sql, N'@city NVARCHAR(50)', @city

9. Use parameterized queries to prevent SQL injection attacks: This practice prevents malicious code injection by passing input values as parameters instead of concatenating them directly into the SQL query string.

Additionally, parameterized queries improve performance by allowing the database engine to reuse query execution plans for similar queries, resulting in faster query execution times.

-- Bad practice
SELECT ID,
LastLoginDate
FROM users
WHERE username = 'Atakan'
AND password = 'password123';

-- Good practice
DECLARE @username VARCHAR(50) = 'Atakan';
DECLARE @password VARCHAR(50) = 'password123';

SELECT ID,
LastLoginDate
FROM users
WHERE username = @username
AND password = @password;

10. Use transactions to ensure data integrity: This practice ensures data integrity by grouping a series of database operations into a single unit of work. Transactions guarantee that either all the operations within the transaction are successfully completed, or none of them are. This prevents data inconsistencies and ensures that the database remains in a consistent state, even if a single operation within the transaction fails.

--Bad Practice
UPDATE orders
SET status = 'paid'
WHERE order_id = 123;

INSERT INTO payments (order_id, amount)
VALUES (123, 100);

--Good Practice
BEGIN TRANSACTION;
UPDATE orders
SET status = 'paid'
WHERE order_id = 123;

INSERT INTO payments (order_id, amount)
VALUES (123, 100);

COMMIT TRANSACTION;

Final Thoughts

T-SQL is a powerful tool for managing data in relational databases. By following these 10 best practices, developers can write efficient, maintainable, and scalable T-SQL code that performs well and is easy to understand.

While there are certainly other best practices that could be followed, these 10 practices represent some of the most important and commonly recommended practices for T-SQL development.

By incorporating them into your development workflow, you can improve the quality of your T-SQL code and make your database applications more efficient and reliable.

If you found this blog post helpful, please give it a clap. Thanks for reading…

--

--

Atakan Korez

Senior Software Engineer | .NET | C# | SQL | Full-Stack | Angular 2+ | Azure | DevOps. Find me at linkedin.com/in/atakankorez/