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