Consider: Declare @stringsvar varchar(1000) Declare @Emp_id int DECLARE @strvar SYSNAME = 'Employee_test' SET @stringsvar = ('select * from' + ' ' + @strvar + ' where emp_id' + ' =' + @Emp_id) Print @stringsvar The above query is giving an error as mentioned below: > Msg 245, Level 16, State 1, Line 17 Conversion failed when converting > the nvarchar value 'select * from Employee_test where emp_id =' to > data type int. What needs to be done in this case?
You need to be careful about [SQL injection attacks][2]. While converting an `INT` to a `VARCHAR 11` is likely not going to cause any issues, [sysname][3] is the equivalent of an `NVARCHAR 128`, and you can jam a lot of extra code in there. To make your code totally safe, you'd want to do this: DECLARE @stringsvar NVARCHAR(1000) = ''; DECLARE @Emp_id INT = 1; DECLARE @strvar sysname = N'Employee_test'; SET @stringsvar = ( N'select * from ' + QUOTENAME(@strvar) + N' where emp_id' + N' = @iEmp_id' ); PRINT @stringsvar; EXEC sys.sp_executesql @stringsvar, N'@iEmp_id INT', @iEmp_id = @Emp_id; Using [sp_executesql][4] to issue parameterized dynamic SQL, and [quotename][5] to make the table name non-executable code is a much safer choice. For a little more reference, I'd suggest heading over here: [The Curse and Blessings of Dynamic SQL][6] [2]: https://codecurmudgeon.com/wp/sql-injection-hall-of-shame/ [3]: https://stackoverflow.com/questions/5720212/what-is-sysname-data-type-in-sql-server [4]: https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-executesql-transact-sql?view=sql-server-2017 [5]: https://docs.microsoft.com/en-us/sql/t-sql/functions/quotename-transact-sql?view=sql-server-2017 [6]: http://www.sommarskog.se/dynamic_sql.html