DECLARE @SQL NVarchar(1000), @DBName NVarchar(50), @CKName NVarchar(50), @Tbl NVarchar(50)SET @DBName = 'Master'SET @CKName = 'FakeName'SET @Tbl = 'Check_Constraints'-- 1: WorksSET @SQL = 'SELECT * FROM ' + @DBName + '.sys.Check_Constraints'EXEC (@SQL)-- 2: WorksSET @SQL = 'SELECT * FROM ' + @DBName + '.sys.Check_Constraints WHERE Name = ''@CK'''EXEC sp_ExecuteSQL @Stmt = @SQL, @Parms = N'@CK NVarchar(50)', @CK = @CKName-- 3: WorksSET @SQL = 'SELECT * FROM ' + @DBName + '.sys.Check_Constraints WHERE Name = @CK'EXEC sp_ExecuteSQL @Stmt = @SQL, @Parms = N'@CK NVarchar(50)', @CK = @CKName-- 4: Works ?? Same as WHERE Name = ''' + @CKName + '''' ??SET @SQL = 'SELECT * FROM ' + @DBName + '.sys.Check_Constraints WHERE Name = ''@CKName'''EXEC sp_ExecuteSQL @Stmt = @SQL, @Parms = N'@CK NVarchar(50)', @CK = @CKName-- 5: Doesn't workSET @SQL = 'SELECT * FROM ' + @DBName + '.sys.Check_Constraints WHERE Name = @CKName'EXEC sp_ExecuteSQL @Stmt = @SQL, @Parms = N'@CK NVarchar(50)', @CK = @CKName/*Msg 137, Level 15, State 2, Line 1Must declare the scalar variable "@CKName".*/-- 6: Doesn't workSET @SQL = N'SELECT * FROM Master.sys.@Tbl2 WHERE Name = @CK2'EXEC sp_ExecuteSQL @Stmt = @SQL, @Params =N'@Tbl2 NVarchar(50), @CK2 NVarchar(50)', @CK2 = @CKName, @Tbl2 = @Tbl/*Msg 102, Level 15, State 1, Line 1Incorrect syntax near '@Tbl2'.*/-- 7: Doesn't workSET @SQL = N'SELECT * FROM @DBName2.sys.Check_Constraints'EXEC sp_ExecuteSQL @Stmt = @SQL, @Params =N'@DBName2 NVarchar(50)', @DBName2 = @DBName/* ErrorMsg 102, Level 15, State 1, Line 1Incorrect syntax near '.'.*/
DECLARE @DB VARCHAR(100) = 'MyDB'SELECT *FROM @DB.sys.check_constraints
DECLARE @DBName NVarchar(50)SET @DBName = 'Master1'IF NOT EXISTS (SELECT * FROM sys.Databases WHERE Name = @DBName)BEGIN PRINT 'Database : ' + @DBName + ' does not exist' RETURNEND
DECLARE @DBName NVarchar(50)SET @DBName = 'Master1'IF NOT EXISTS (SELECT * FROM sys.Databases WHERE Name = @DBName)BEGIN -- example of dynamic sql DECLARE @sql NVARCHAR(1000) SET @sql = 'PRINT ''Database : ' + @DBName + ' does not exist''' EXEC (@sql)END
CREATE TABLE check_injection (i int) GO -- Check for sql injection select * from check_injectiongoDECLARE @DBName NVarchar(50)-- SET @DBName = 'Master1'-- Someone injected this bit:SET @DBName = ''';DROP TABLE check_injection; PRINT ''bb'';--'IF NOT EXISTS (SELECT * FROM sys.Databases WHERE Name = @DBName)BEGIN -- example of dynamic sql select QUOTENAME(@DBName) DECLARE @sql NVARCHAR(1000) SET @sql = 'PRINT ''Database : ' + @DBName + ' does not exist''' EXEC (@sql)ENDselect * from check_injection