One of the more useful clauses available in SQL Server 2005 and beyond is OUTPUT, but it is rarely seen in use. Here is a quick example of how to use it within an INSERT statement.
Let’s setup our table structure first:
IF EXISTS (SELECT * FROM sys.tables WHERE name = 'users') BEGIN DROP TABLE [users]; END; CREATE TABLE [users] ( [user_id] INT PRIMARY KEY IDENTITY(1,1), username VARCHAR(16), [password] VARCHAR(16), email VARCHAR(128) ); IF EXISTS (SELECT * FROM sys.tables WHERE name = 'login_activity') BEGIN DROP TABLE [login_activity]; END; CREATE TABLE [login_activity] ( user_id INT, user_ip VARCHAR(15), login_username VARCHAR(16), login_success BIT, login_time DATETIME );
Let’s assume we want an addUser procedure to create a user, log in said user, and return the new user’s user_id. Here is how we could do that with the OUTPUT clause:
CREATE PROC addUser @user_ip VARCHAR(15), @username VARCHAR(16), @password VARCHAR(16), @email VARCHAR(128) AS SET NOCOUNT ON; CREATE TABLE #new_user(user_id INT); INSERT INTO users (username, [password], email) OUTPUT inserted.[user_id] INTO #new_user(user_id) VALUES (@username, @password, @email); INSERT INTO login_activity(user_id, login_ip, login_username, login_success, login_time) SELECT user_id, @username, @user_ip, 1, CURRENT_TIMESTAMP FROM #new_user; SET NOCOUNT OFF; SELECT user_id FROM new_user;
EXEC [addUser] @user_ip = '192.168.1.1', @username = 'bob', @password = 'bob!password', @email = 'bob@gmail.com'; user_id ----------- 1 EXEC [addUser] @user_ip = '192.168.1.2', @username = 'john', @password = 'john!password', @email = 'john@yahoo.com'; user_id ----------- 2