I have the following table:
CREATE TABLE Wages (EmpID INT, Amount MONEY)
INSERT INTO Wages VALUES (1,25000), (2,30000), (3,35000), (4, 40000)
SELECT * FROM Wages
I want to create a procedure that uses sp_executesql where I can change, not only the values in the WHERE clause, but also the relationship - i.e greater than (>) or less than (<).
Lets say I had:
SELECT * FROM Wages WHERE EmpID > 2 AND Amount > 30000
or
SELECT * FROM Wages WHERE EmpID <= 2 AND Amount <= 30000
How would I code this so that I could pass in '<' or '=' instead of '>' to get this:
SELECT * FROM Wages WHERE EmpID < 2 AND Amount < 30000
I tried this:
DECLARE @Amount MONEY
DECLARE @EmpID INT
DECLARE @EmpSYMBOL NVARCHAR(2)
DECLARE @AmountSYMBOL NVARCHAR(2)
DECLARE @SQL2 NVARCHAR(2000) = 'SELECT * FROM Wages WHERE EmpID '+ @EmpSYMBOL+' @EmpID AND Amount '+ @AmountSYMBOL+' @Amount'
EXEC sp_executesql @SQL2, N'@EmpID INT, @Amount MONEY, @EmpSYMBOL NVARCHAR(2), @AmountSYMBOL NVARCHAR(2)',2, 30000,'<','<';
but although it runs without error nothing comes back
This returns an error:
DECLARE @Amount MONEY
DECLARE @EmpID INT
DECLARE @EmpSYMBOL NVARCHAR(2)
DECLARE @AmountSYMBOL NVARCHAR(2)
DECLARE @SQL2 NVARCHAR(2000) = 'SELECT * FROM Wages WHERE EmpID @EmpSYMBOL @EmpID AND Amount @AmountSYMBOL @Amount'
EXEC sp_executesql @SQL2, N'@EmpID INT, @Amount MONEY, @EmpSYMBOL NVARCHAR(2), @AmountSYMBOL NVARCHAR(2)',2, 30000,'<','<';
EDIT In view of the helpful answer below I did the following:
CREATE PROC GetWages @EmpSYMBOL NVARCHAR(2), @EmpID INT,@AmountSYMBOL NVARCHAR(2), @Amount MONEY
AS
IF @EmpID IN (1,2,3,4)
AND (@Amount BETWEEN 25000 AND 40000)
AND @EmpSYMBOL IN('>','<','<>','!=','=', '<=','>=')
AND @AmountSYMBOL IN('>','<','<>','!=','=', '<=','>=')
BEGIN
DECLARE @SQL NVARCHAR(200)='
SELECT * FROM Wages WHERE Amount '+@AmountSYMBOL+' @Amount AND EmpiD '+@EmpSYMBOL+' @EmpID'
EXEC sp_executesql @SQl , N'@Amount MONEY ,@EmpID INT',@Amount, @EmpID
END
ELSE
PRINT 'Input variable(s) out of range'
Given that I am I am doing my own input value parameter checking I guess I could also do this:
ALTER PROC GetWages @EmpSYMBOL NVARCHAR(2), @EmpID INT,@AmountSYMBOL NVARCHAR(2), @Amount MONEY
AS
IF @EmpID IN (1,2,3,4)
AND (@Amount BETWEEN 25000 AND 40000)
AND @EmpSYMBOL IN('>','<','<>','!=','=', '<=','>=')
AND @AmountSYMBOL IN('>','<','<>','!=','=', '<=','>=')
BEGIN
DECLARE @SQL NVARCHAR(200)='
SELECT * FROM Wages WHERE Amount '+@AmountSYMBOL
+' '+CAST(@Amount AS NVARCHAR(8))+' AND EmpiD '
+@EmpSYMBOL+' '+CAST(@EmpID AS NVARCHAR(1))
EXEC sp_executesql @SQl
END
ELSE
PRINT 'Input variable(s) out of range'