动态执行SQL语句,“SELECT TOP N *”语句中“N”不能为变量的解决方案
来源:互联网 发布:外包美工主要干嘛 编辑:程序博客网 时间:2024/06/05 20:37
前段时间,想写一个返回指定数量记录的PROCEDURE,代码如下:
CREATE PROCEDURE GetSomeArticles
@cnt int = 1
AS
SELECT TOP @cnt * FROM Articles
结果发现无法运行,始终有问题,百思不得其解,后来询问了一下老师才知道,SELECT TOP N这里的参数N只能为常量,不能为变量。
如果在程序中直接定义SQL语句,然后执行,是可以达到预期效果的:
- int cnt = 10;
- string strSQL = "SELECT TOP " + cnt.ToString() + " * FROM Articles";
- //我自己写的一个应用了工厂设计模式的操作数据库的类
- //封装了N多操作数据库的方法
- //并且实现了数据库无关性
- //即可以用同样的代码来操作Access、MS SQL SERVER、MySQL
- //理论上也可以实现操作Oracle,只是没用过它,所以暂时没实现,呵呵
- CommDB db = CreateDB.Create();
- //执行数据库操作,返回一个DataSet
- DataSet ds = db.ExecSQL(strSQL);
但是我确实有这样的需要,想用存储过程来实现,这可怎么办呢?还好,有动态执行SQL这一说法(其实我也不知道这一说法是否准确,暂且这样称呼吧),于是我们可以这样写存储过程:
CREATE PROCEDURE GetSomeArticles
@cnt int = 1
AS
EXEC ("SELECT TOP " + @cnt + " * FROM Articles")
这样就可以解决SELECT TOP N中那个N只能为常量的问题了^_^
另,在MySQL中要实现类似的功能,可以这样写:
DELIMITER $$
CREATE PROCEDURE `GetSomeArticles`(in cnt int)
BEGIN
set @stmt = concat('SELECT * FROM Articles LIMIT 0, ?');
prepare s1 from @stmt;
set @s1 = cnt;
execute s1 using @s1;
deallocate prepare s1;
END$$
DELIMITER ;
- 动态执行SQL语句,“SELECT TOP N *”语句中“N”不能为变量的解决方案
- “SELECT TOP N *”语句中“N”不能为变量的解决方案
- sql语句中select top n与oracle的rownum与mysql的limit用法
- sql语句中select top n与oracle的rownum与mysql的limit用法
- sql语句中select top n与oracle的rownum与mysql的limit用法
- sql语句中select top n与oracle的rownum与mysql的limit用法
- 使用HQL 语句实现select top N
- SQL 分类汇总 TOP n 语句
- SQL中SELECT语句的执行顺序
- SQL中SELECT语句的执行顺序
- SQL 中 SELECT 语句的执行顺序
- SQL中SELECT语句的执行顺序
- SQL中SELECT语句的执行顺序
- SQL中SELECT语句的执行顺序
- SQL中Select语句的执行顺序
- SQL中SELECT语句的执行顺序
- SQL 中 SELECT 语句的执行顺序
- SQL语句中SELECT语句的执行顺序
- 六大技术为你的CRM锦上添花
- 用javascript操作数据库
- Oracle体系结构与术语
- 对于字符串向smalldatetime转换失败问题的解决
- Oracle Text 的体系结构及其使用
- 动态执行SQL语句,“SELECT TOP N *”语句中“N”不能为变量的解决方案
- 关于level_idc和Profile_IDC的解释
- EAI概述,需求,功能,技术要点----4. EAI项目开发过程
- 深入探讨PHP中的内存管理问题
- 适用于Jsp的通用分页程序(示例代码)
- 用例包含关系与用例扩展关系的区别
- 计算机网络的结构
- 女人出轨的八种主打心态
- 业务规则管理(Business Rules Management,简称BRM)