EXEC用法总结

一、使用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--';

你可能感兴趣的:(EXEC用法总结)