SQL测试:查询语句

发布网友 发布时间:2022-04-23 21:39

我来回答

15个回答

热心网友 时间:2022-04-07 16:51

并非原创,只是做了些修改

CREATE PROCEDURE pageselect

@tblName varchar(255), -- 表名

@strGetFields varchar(1000) = '*', -- 需要返回的列

@fldName varchar(255)='', -- 不重复主键的字段名

@orderName varchar(255)='', --要排序的字段名

@PageSize int = 10, -- 页尺寸

@PageIndex int = 1, -- 页码

@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序

@strWhere varchar(1500) = '' -- 查询条件 (注意: 不要加 where)

AS

declare @strSQL varchar(5000) -- 主语句

declare @strTmp varchar(110) -- 临时变量

declare @strOrder varchar(400) -- 排序类型

if @OrderType != 0

begin

set @strTmp = ' not in (select '

set @strOrder = ' order by [' + @orderName +'] desc'

--如果@OrderType不是0,就执行降序,这句很重要!

end

else

begin

set @strTmp = ' not in (select '

set @strOrder = ' order by [' + @orderName +'] asc'

end

if @PageIndex = 1

begin

if @strWhere != ''

set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from [' + @tblName + '] where ' + @strWhere + ' ' + @strOrder

else

set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from ['+ @tblName + '] '+ @strOrder

--如果是第一页就执行以上代码,这样会加快执行速度

end

else

begin

--以下代码赋予了@strSQL以真正执行的SQL代码

set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from ['

+ @tblName + '] where [' + @fldName + ']' + @strTmp + '['+ @fldName + '] from (select top '

+ str((@PageIndex-1)*@PageSize) + ' ['+ @fldName + '] from [' + @tblName + ']' + @strOrder + ') as tblTmp)'+ @strOrder

if @strWhere != ''

set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from ['

+ @tblName + '] where [' + @fldName + ']' + @strTmp + '['

+ @fldName + '] from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['

+ @fldName + '] from [' + @tblName + '] where ' + @strWhere + ' '

+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder

end

exec (@strSQL)

热心网友 时间:2022-04-07 18:09

因为SQL中的记录是没有记录号的概念,也就是没有先后次序的概念,所以要取其中20~40条记录是没有好的办法的。

如果确实有这种需求,那么在做系统设计时就要注意,然后把它转化为别的需求,再不就是自行增加一个类似记录号的字段,来满足需求。

对于已有的数据,却没有类似记录号的字段,实现起来可就真是麻烦了!
并且SQL无法实现这种带变量的查询语句:Select top @num * from [tablename],会报错的!

有一个实现方法是:将数据放到一个临时表中,临时表比实际表多一个整型定做,再用循环给所有记录编上序号放在这个整型字段中,最后查询这个字段在一定范围的值。
如下是写入序号的关键语句(不建议用游标,太耗资源),假设表的主键字段名叫[item],临时表的序号存放在字段[ID]中,要求查询的最小与最大序号为@min和@max(在存储过程中由参数传入)

declare @i int, @key int, @max int, @min int
select *, 0 as [id] into [#tablename] from [tablename]
set @i=1
while 1=1 begin
set @key=(select top 1 [item] from [#tablename] where [id]=0 order by item)
if @key is null break
else begin
update [#tablename] set [id]=@i where [item]=@key
set @i=@i+1
end
end

--最后的查询语句:
select * from [#tablename] where [id] between @min and @max order by [item]

热心网友 时间:2022-04-07 19:44

这类查询必须有主键!
你表里没有说明那个是主键,我们暂且假设item是主键吧

select top 20 * from tablename where item not in
(
select top 20 item from tablename )

这个没必要用存储过程。

你可能看到的需要存储过程的一般是拿这个做分页用,既传当前页和页大小。

这种查询在数据集比较大时,效率会比较低。但20,30十万基本没问题。

热心网友 时间:2022-04-07 21:35

--不知你的数据库引擎是 SQLSERVER2000 还是 SQLSERVER2005
--假设是:SQLSERVER2000
--这个句子在每次SQLSERVER服务启动后的第一次执行要相对慢一点
--第二次及以后就很快了!
CREATE PROCEDURE Pro_Name (@BeginRow int,@EndRow int)
AS
BEGIN
SELECT IDENTITY(int,1,1) AS FID,*
INTO #Table
FROM Table_Name
SELECT * FROM #Table
WHERE FID BETWEEN @BeginRow AND @EndRow
END
GO

--假设数据库引擎是 SQLSERVER2005
--这个的运行速度很快,就我所知应该是你这个需求最高效率的方式了
CREATE PROCEDURE Pro_Name_Temp (@BeginRow int,@EndRow int)
AS
BEGIN
SELECT * FROM
(
SELECT Row_Number() OVER (ORDER BY Item) AS Row,*
FROM Table_Name
) AS T
WHERE Row BETWEEN @BeginRow AND @EndRow
END
GO

--在这两种句式下:@BeginRow 和 @EndRow 是返回条目的范围值,要求输入!

热心网友 时间:2022-04-07 23:43

------------------------------------
--用途:分页存储过程(对有主键的表效率极高)
--说明:
------------------------------------

CREATE PROCEDURE UP_GetRecordByPage
@tblName varchar(255), -- 表名
@fldName varchar(255), -- 主键字段名
@PageSize int = 10, -- 页尺寸
@PageIndex int = 1, -- 页码
@IsReCount bit = 0, -- 返回记录总数, 非 0 值则返回
@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
@strWhere varchar(4000) = '' -- 查询条件 (注意: 不要加 where)
AS

declare @strSQL varchar(8000) -- 主语句
declare @strTmp varchar(4000) -- 临时变量
declare @strOrder varchar(4000) -- 排序类型

if @OrderType != 0
begin
set @strTmp = '<(select min'
set @strOrder = ' order by [' + @fldName +'] desc'
end
else
begin
set @strTmp = '>(select max'
set @strOrder = ' order by [' + @fldName +'] asc'
end

set @strSQL = 'select top ' + str(@PageSize) + ' * from ['
+ @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
+ @fldName + '] from [' + @tblName + ']' + @strOrder + ') as tblTmp)'
+ @strOrder

if @strWhere != ''
set @strSQL = 'select top ' + str(@PageSize) + ' * from ['
+ @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
+ @fldName + '] from [' + @tblName + '] where ' + @strWhere + ' '
+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder

if @PageIndex = 1
begin
set @strTmp =''
if @strWhere != ''
set @strTmp = ' where ' + @strWhere

set @strSQL = 'select top ' + str(@PageSize) + ' * from ['
+ @tblName + ']' + @strTmp + ' ' + @strOrder
end

if @IsReCount != 0
set @strSQL = 'select count(*) as Total from [' + @tblName + ']'+' where ' + @strWhere

exec (@strSQL)
GO

热心网友 时间:2022-04-08 02:08

create or repalce procere find_sources
begin
select top 20 *
from (select top 40 * from tablename order by rowid desc) --按照降序排列前40条数据
order by item asc --按照升序排列重新获取的20条数据
end find_sources
/

如果需要存储过程能够灵活运用,在存储过程开始的时候声明几个变量就可以了
create procere procere_name(prameter1 in 数据类型,...)
begin
......
end procere_name
/

热心网友 时间:2022-04-08 04:49

兄弟才疏学浅,不知道下面是否是你的要求
//不传参数
if exists(select name from sysobjects where name='proc_tablename' and type='p')
drop procere proc_tablename
go
create procere proc_tablename
as
select top 20 * from tablename where item not in (select top 40 * from tablename order by item)
order by item

exec proc_tablename

//传递参数
if exists(select name from sysobjects where name='proc_tablename2' and type='p')
drop procere proc_tablename2
go
create procere proc_tablename2
@param1 int ,
@param2 int
as
select top @param2-@param1 * from tablename where item not in (select top (@param2-@param1)*2 * from tablename order by item)
order by item

exec proc_tablename2 @param1=20,@param2=40

热心网友 时间:2022-04-08 07:47

1。
select * from tablename order by item limit 20,20;
2。
--启动事务
BEGIN TRAN

DECLARE @ASql VARCHAR(8000)
DECLARE tnames_cursor CURSOR LOCAL FAST_FORWARD FOR '+ @asqlstring +'
OPEN tnames_cursor
FETCH NEXT FROM tnames_cursor INTO @ASql
WHILE (@@FETCH_STATUS=0)
BEGIN
print @ASql
EXEC (@ASql)
IF @@ERROR <> 0 GOTO FINALEX99v
FETCH NEXT FROM tnames_cursor INTO @ASql
END
CLOSE tnames_cursor
DEALLOCATE tnames_cursor

COMM99v TRAN
RETURN

FINALEX99v:
ROLLBACK TRAN
CLOSE tnames_cursor
DEALLOCATE tnames_cursor

')
使用方法:
declare @sql varchar(8000)
set @sql='select ''update a set a.a='' + b.a from b '
exec Pr_execsql2 @sql

热心网友 时间:2022-04-08 11:02

必须有主键!假设item是主键。
create procere xxx @FirstItem int,@LastItem int as
declare @s varchar(8000)
set @s='select * from tablename where item in (select top '+cast(@LastItem as varchar(10))+' item from tablename) and item not in (select top '+cast(@FirstItem-1 as varchar(10))+' item from tablename) order by item'
execute(@s)
go

如果需要20到40条:
xxx 20,40

热心网友 时间:2022-04-08 14:33

!!!!不用存储过程 sqlserver2005 自带分页功能了!!!!!
!!!!效率绝对在你自写存储过程之上!!!!!!!!!!!!
select * from (
SELECT row_number() over (order by item) as row,*
FROM tablename
) t
where row between 20 and 40

热心网友 时间:2022-04-08 18:21

select * form tablename where rownum<=40
minus
select * from tablename where rownum<=20

谢谢吧!

热心网友 时间:2022-04-08 22:26

同意chenjin99说的,如果是大量数据要范围取值,还是建立号相应的聚集索引。

热心网友 时间:2022-04-09 02:47

create proc st
AS
BEGIN
select * , ROW_NUMBER() OVER(order by item desc) as row from tablename
) a
where row between 20 and 30
END

试一下

sqlserver2005 的新功能

热心网友 时间:2022-04-09 07:25

你的表没有主键.无法实现
先定义好主键再来提问

热心网友 时间:2022-04-09 12:20

请参考:
http://www.cnblogs.com/84ww/archive/2008/05/11/1192346.html

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com