国外有名的网站,海南网站建设方案,多php网站空间,营销技巧和话术本文转自#xff1a;http://www.cnblogs.com/hnsdwhl/archive/2011/07/23/2114730.html 当需要根据外部输入的参数来决定要执行的SQL语句时#xff0c;常常需要动态来构造SQL查询语句#xff0c;个人觉得用得比较多的地方就是分页存储过程和执行搜索查询的SQL语句。一个比较… 本文转自http://www.cnblogs.com/hnsdwhl/archive/2011/07/23/2114730.html 当需要根据外部输入的参数来决定要执行的SQL语句时常常需要动态来构造SQL查询语句个人觉得用得比较多的地方就是分页存储过程和执行搜索查询的SQL语句。一个比较通用的分页存储过程可能需要传入表名字段过滤条件排序等参数而对于搜索的话可能要根据搜索条件判断来动态执行SQL语句。 在SQL Server中有两种方式来执行动态SQL语句分别是exec和sp_executesql。sp_executesql相对而言具有更多的优点它提供了输入输出接口可以将输入输出变量直接传递到SQL语句中而exec只能通过拼接的方式来实现。还有一个优点就是sp_executesql能够重用执行计划这就大大提高了执行的性能。所以一般情况下建议选择sp_executesql来执行动态SQL语句。 使用sp_executesql需要注意的一点就是它后面执行的SQL语句必须是Unicode编码的字符串所以在声明存储动态SQL语句的变量时必须声明为nvarchar类型否则在执行的时候会报“过程需要类型为 ntext/nchar/nvarchar 的参数 statement”的错误如果是使用sp_executesql直接执行SQL语句则必须在前面加上大写字母N以表明后面的字符串是使用Unicode类型编码的。 下面来看看几种动态执行SQL语句的情况 1.普通SQL语句 (1)exec(select * from Student) (2)exec sp_executesql Nselect * from Student--此处一定要加上N否则会报错 2.带参数的SQL语句 (1)declare sql nvarchar(1000) declare userId varchar(100) set userId0001 set sqlselect * from Student where UserIDuserId exec(sql) (2)declare sql nvarchar(1000) declare userId varchar(100) set userId0001 set sqlNselect * from Student where UserIDuserId exec sp_executesql sql,NuserId varchar(100),userId 从这个例子中可以看出使用sp_executesql可以直接将参数写在sql语句中而exec需要使用拼接的方式这在一定程度上可以防止SQL注入因此sp_executesql拥有更高的安全性。另外需要注意的是存储sql语句的变量必须声明为nvarchar类型的。 (3)带输出参数的SQL语句 create procedure sp_GetNameByUserId ( userId varchar(100), userName varchar(100) output ) as declare sql nvarchar(1000) set sqlNselect userNameUserName from Student where UserIduserId exec sp_executesql NuserId varchar(100),userName varchar(100) output,userId,userName output select userName