一、使用EXEC执行存储过程
例如存储过名为:myprocedure
1 use AdventureWorks
2 create procedure myprocedure @cityvarchar(20)
3 as
4 begin
5 select * from Person.Address
6 end
7 exec myprocedure @city ='Bothell'
8 --或
9 exec myprocedure 'Bothell'
二、使用EXEC执行动态的SQL语句
注意:动态的sql必须包含于圆括号内如:
1 exec('select * from mytable')
使用EXEC执行动态sql语句注意下面问题
1.不能有输入参数,输出参数
下面的脚本是错误的:
1 DECLARE@iASINT;
2 SET@i = 10248;
3 DECLARE@sqlASVARCHAR(52);
4 SET@sql ='SELECT * FROM dbo.Orders WHERE OrderID = @i;';
5 EXEC(@sql);
6 GO
2.园括号内部能使用函数或case表达式
下面的脚本是错误的:
1 DECLARE@schemanameASNVARCHAR(128), @tablenameASNVARCHAR(128);
2 SET@schemaname = N'dbo';
3 SET@tablename = N'Order Details';
4 EXEC(N'SELECT COUNT(*) FROM '
5 + QUOTENAME(@schemaname) + N'.'+ QUOTENAME(@tablename) + N';');
6 GO
不过把函数放在变量中是可以的:
1 DECLARE
2 @schemanameASNVARCHAR(128),
3 @tablenameASNVARCHAR(128),
4 @sqlASNVARCHAR(539);
5 SET@schemaname = N'dbo';
6 SET@tablename = N'Order Details';
7 SET@sql = N'SELECT COUNT(*) FROM '
8 + QUOTENAME(@schemaname) + N'.'+ QUOTENAME(@tablename) + N';'
9 EXEC(@sql);
3.不能利用重用执行计划,存所以存在性能问题
1 DECLARE@iASINT;
2 SET@i = 10248;
3 DECLARE@sqlASVARCHAR(52);
4 SET@sql ='SELECT * FROM dbo.Orders WHERE OrderID = '
5 +CAST(@iASVARCHAR(10)) + N';';
6 EXEC(@sql);
7 GO
当@i = 10248, 10249, 10250要生成3个执行计划。
4。容易被sql注入,存在安全问题。
1 DECLARE@lastnameASNVARCHAR(40), @sqlASNVARCHAR(200);
2 SET@lastname = N''' DROP TABLE dbo.Employees --';
3 SET@sql = N'SELECT * FROM dbo.Employees WHERE LastName = '''
4 + @lastname +''';';
5 EXEC@sql;
6 GO
实际执行的sql为:
1 SELECT*FROMdbo.EmployeesWHERELastName =''DROPTABLEdbo.Employees--';