Oracle 数据导入到Sql Server 2005的Sql语句如何转换。

zeng_84_long 2009-03-25 03:19:33
我在Oracle数据库中运行
SELECT typ,typName,operatorTyp,seqNo,remarks, CNT FROM ( SELECT COUNT (1) CNT FROM (SELECT MST06007 as typ,MST06008 as typName,
MST06009 as operatorTyp,MST06010 as seqNo,
MST06011 as remarks
FROM MST06
ORDER BY MST06010
)),( SELECT typ,typName,operatorTyp,seqNo,remarks FROM ( SELECT MY_TABLE.*, ROWNUM AS MY_ROWNUM FROM (
SELECT MST06007 as typ,MST06008 as typName,
MST06009 as operatorTyp,MST06010 as seqNo,
MST06011 as remarks
FROM MST06
ORDER BY MST06010
) MY_TABLE WHERE ROWNUM <= 10) WHERE MY_ROWNUM > 0)是正确的,但是如何在Sql Server 2005和Access中如何实现上面的Sql功能呢?
...全文
564 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zeng_84_long 2009-03-25
  • 打赏
  • 举报
回复
谢谢,现在理解了。
fcuandy 2009-03-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zeng_84_long 的回复:]
请问如何用where 做 where条件呢?
比如SELECT MST06007 as typ,MST06008 as typName,
MST06009 as operatorTyp,MST06010 as seqNo,
MST06011 as remarks,(SELECT COUNT(*) CNT FROM MST06) CNT
FROM MST06
WHERE TOP > 10 AND TOP <13-------------------------此处是错误的,只是描述分页的判断条件。
ORDER BY MST06010
[/Quote]

需要这种功能的话,嵌套一层子查询用row_number()就可以了,可以当用oracle的rownum用。

比如:


SELECT TOP 100 PERCENT *,idx=ROW_NUMBER() OVER (ORDER BY GETDATE() /*按记录取出顺序*/)
FROM tb ORDER BY 排序列

如果结果集输出顺序不要求,而只是希望定位到的记录行范围是正确的那么可以是
SELECT * ,idx=ROW_NUMBER() OVER (ORDER BY GETDATE() /*按记录取出顺序*/) FROM tb


将上面这句作为子查询:

SELECT * FROM (上面这句) AS x WHERE idx BETWEEN 10 AND 13
jinjazz 2009-03-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zeng_84_long 的回复:]
TOP不支持变量查询吧?
[/Quote]

sql 2005 支持top(@变量)
zeng_84_long 2009-03-25
  • 打赏
  • 举报
回复
取出access表A中第31到第40记录的Sql语句可以如下
方法一: select top 10 * from A where id not in (select top 30 id from A)
方法二: select top 10 * from A where id > (select max(id) from (select top 30 id from A )as A) 。但是访问量大的时候,系统可能会崩溃。
zeng_84_long 2009-03-25
  • 打赏
  • 举报
回复
TOP不支持变量查询吧?
zeng_84_long 2009-03-25
  • 打赏
  • 举报
回复
请问如何用where 做 where条件呢?
比如SELECT MST06007 as typ,MST06008 as typName,
MST06009 as operatorTyp,MST06010 as seqNo,
MST06011 as remarks,(SELECT COUNT(*) CNT FROM MST06) CNT
FROM MST06
WHERE TOP > 10 AND TOP<13-------------------------此处是错误的,只是描述分页的判断条件。
ORDER BY MST06010
fcuandy 2009-03-25
  • 打赏
  • 举报
回复
SQL2005,SQL2k
SELECT TOP 10 MST06007 as typ,MST06008 as typName,
MST06009 as operatorTyp,MST06010 as seqNo,
MST06011 as remarks,CNT
FROM MST06 a
CROSS JOIN
(SELECT COUNT(*) CNT FROM MST06) b
ORDER BY MST06010



ACCESS, try:


SELECT TOP 10 MST06007 as typ,MST06008 as typName,
MST06009 as operatorTyp,MST06010 as seqNo,
MST06011 as remarks,(SELECT COUNT(*) CNT FROM MST06) CNT
FROM MST06
ORDER BY MST06010


当然,下面的写法同时适用于sql2k,sql2005
zeng_84_long 2009-03-25
  • 打赏
  • 举报
回复
dawugui建立过程的方式在软件开发中不太合适,Oracle支持的是PL/Sql,Sql Server支持的是T-Sql,用top 替换ROWNUM 在Sql server中运行SELECT typ,typName,operatorTyp,seqNo,remarks, CNT FROM ( SELECT COUNT (1) CNT FROM (SELECT MST06007 as typ,MST06008 as typName,
MST06009 as operatorTyp,MST06010 as seqNo,
MST06011 as remarks
FROM MST06
ORDER BY MST06010
)),( SELECT typ,typName,operatorTyp,seqNo,remarks FROM ( SELECT MY_TABLE.*, ROWNUM AS MY_ROWNUM FROM (
SELECT MST06007 as typ,MST06008 as typName,
MST06009 as operatorTyp,MST06010 as seqNo,
MST06011 as remarks
FROM MST06
ORDER BY MST06010
) MY_TABLE WHERE ROWNUM <= 10) WHERE MY_ROWNUM > 0)

还是错误的。
zeng_84_long 2009-03-25
  • 打赏
  • 举报
回复
测试数据:
INSERT INTO MST06 ( MST06000, MST06001, MST06002, MST06003, MST06004, MST06005, MST06006, MST06007,
MST06008, MST06009, MST06010, MST06011 ) VALUES (
NULL, TO_Date( '04/29/2008 06:04:44 下午', 'MM/DD/YYYY HH:MI:SS AM'), '192.168.18.7'
, '', TO_Date( '07/04/2008 10:12:23 上午', 'MM/DD/YYYY HH:MI:SS AM'), '192.168.18.7'
, '', 'Equipoptions', '设备类别', 'SYSTEM', 10, NULL);
INSERT INTO MST06 ( MST06000, MST06001, MST06002, MST06003, MST06004, MST06005, MST06006, MST06007,
MST06008, MST06009, MST06010, MST06011 ) VALUES (
NULL, TO_Date( '05/26/2008 11:31:17 上午', 'MM/DD/YYYY HH:MI:SS AM'), '192.168.18.7'
, '', NULL, NULL, NULL, 'ployOptions', '活动类别', 'SYSTEM', 17, NULL);
INSERT INTO MST06 ( MST06000, MST06001, MST06002, MST06003, MST06004, MST06005, MST06006, MST06007,
MST06008, MST06009, MST06010, MST06011 ) VALUES (
NULL, TO_Date( '05/29/2008 01:32:01 下午', 'MM/DD/YYYY HH:MI:SS AM'), '192.168.18.7'
, '', NULL, NULL, NULL, 'docOptions', '文档类别', 'SYSTEM', 20, NULL);
INSERT INTO MST06 ( MST06000, MST06001, MST06002, MST06003, MST06004, MST06005, MST06006, MST06007,
MST06008, MST06009, MST06010, MST06011 ) VALUES (
NULL, TO_Date( '04/29/2008 01:04:17 下午', 'MM/DD/YYYY HH:MI:SS AM'), '192.168.18.7'
, '', TO_Date( '04/29/2008 05:30:19 下午', 'MM/DD/YYYY HH:MI:SS AM'), '192.168.18.3'
, '', 'Face', '政治面貌', 'SYSTEM', 3, '所具有的政治面貌');
commit;
jinjazz 2009-03-25
  • 打赏
  • 举报
回复
WHERE ROWNUM <= 10就等于sqlserver的 top 10
dawugui 2009-03-25
  • 打赏
  • 举报
回复
--TOP n 实现的通用分页存储过程(转自邹建)
CREATE PROC sp_PageView
@tbname sysname, --要分页显示的表名
@FieldKey nvarchar(1000), --用于定位记录的主键(惟一键)字段,可以是逗号分隔的多个字段
@PageCurrent int=1, --要显示的页码
@PageSize int=10, --每页的大小(记录数)
@FieldShow nvarchar(1000)='', --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段
@FieldOrder nvarchar(1000)='', --以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC
用于指定排序顺序
@Where nvarchar(1000)='', --查询条件
@PageCount int OUTPUT --总页数
AS
SET NOCOUNT ON
--检查对象是否有效
IF OBJECT_ID(@tbname) IS NULL
BEGIN
RAISERROR(N'对象"%s"不存在',1,16,@tbname)
RETURN
END
IF OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTable')=0
AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsView')=0
AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTableFunction')=0
BEGIN
RAISERROR(N'"%s"不是表、视图或者表值函数',1,16,@tbname)
RETURN
END

--分页字段检查
IF ISNULL(@FieldKey,N'')=''
BEGIN
RAISERROR(N'分页处理需要主键(或者惟一键)',1,16)
RETURN
END

--其他参数检查及规范
IF ISNULL(@PageCurrent,0)<1 SET @PageCurrent=1
IF ISNULL(@PageSize,0)<1 SET @PageSize=10
IF ISNULL(@FieldShow,N'')=N'' SET @FieldShow=N'*'
IF ISNULL(@FieldOrder,N'')=N''
SET @FieldOrder=N''
ELSE
SET @FieldOrder=N'ORDER BY '+LTRIM(@FieldOrder)
IF ISNULL(@Where,N'')=N''
SET @Where=N''
ELSE
SET @Where=N'WHERE ('+@Where+N')'

--如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值)
IF @PageCount IS NULL
BEGIN
DECLARE @sql nvarchar(4000)
SET @sql=N'SELECT @PageCount=COUNT(*)'
+N' FROM '+@tbname
+N' '+@Where
EXEC sp_executesql @sql,N'@PageCount int OUTPUT',@PageCount OUTPUT
SET @PageCount=(@PageCount+@PageSize-1)/@PageSize
END

--计算分页显示的TOPN值
DECLARE @TopN varchar(20),@TopN1 varchar(20)
SELECT @TopN=@PageSize,
@TopN1=(@PageCurrent-1)*@PageSize

--第一页直接显示
IF @PageCurrent=1
EXEC(N'SELECT TOP '+@TopN
+N' '+@FieldShow
+N' FROM '+@tbname
+N' '+@Where
+N' '+@FieldOrder)
ELSE
BEGIN
--处理别名
IF @FieldShow=N'*'
SET @FieldShow=N'a.*'

--生成主键(惟一键)处理条件
DECLARE @Where1 nvarchar(4000),@Where2 nvarchar(4000),
@s nvarchar(1000),@Field sysname
SELECT @Where1=N'',@Where2=N'',@s=@FieldKey
WHILE CHARINDEX(N',',@s)>0
SELECT @Field=LEFT(@s,CHARINDEX(N',',@s)-1),
@s=STUFF(@s,1,CHARINDEX(N',',@s),N''),
@Where1=@Where1+N' AND a.'+@Field+N'=b.'+@Field,
@Where2=@Where2+N' AND b.'+@Field+N' IS NULL',
@Where=REPLACE(@Where,@Field,N'a.'+@Field),
@FieldOrder=REPLACE(@FieldOrder,@Field,N'a.'+@Field),
@FieldShow=REPLACE(@FieldShow,@Field,N'a.'+@Field)
SELECT @Where=REPLACE(@Where,@s,N'a.'+@s),
@FieldOrder=REPLACE(@FieldOrder,@s,N'a.'+@s),
@FieldShow=REPLACE(@FieldShow,@s,N'a.'+@s),
@Where1=STUFF(@Where1+N' AND a.'+@s+N'=b.'+@s,1,5,N''),
@Where2=CASE
WHEN @Where='' THEN N'WHERE ('
ELSE @Where+N' AND ('
END+N'b.'+@s+N' IS NULL'+@Where2+N')'

--执行查询
EXEC(N'SELECT TOP '+@TopN
+N' '+@FieldShow
+N' FROM '+@tbname
+N' a LEFT JOIN(SELECT TOP '+@TopN1
+N' '+@FieldKey
+N' FROM '+@tbname
+N' a '+@Where
+N' '+@FieldOrder
+N')b ON '+@Where1
+N' '+@Where2
+N' '+@FieldOrder)
END



-- 字符串缓存实现的通用分页存储过程(转自邹建)
CREATE PROC sp_PageView
@tbname sysname, --要分页显示的表名
@FieldKey sysname, --用于定位记录的主键(惟一键)字段,只能是单个字段
@PageCurrent int=1, --要显示的页码
@PageSize int=10, --每页的大小(记录数)
@FieldShow nvarchar(1000)='', --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段
@FieldOrder nvarchar(1000)='', --以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC
用于指定排序顺序
@Where nvarchar(1000)='', --查询条件
@PageCount int OUTPUT --总页数
AS
DECLARE @sql nvarchar(4000)
SET NOCOUNT ON
--检查对象是否有效
IF OBJECT_ID(@tbname) IS NULL
BEGIN
RAISERROR(N'对象"%s"不存在',1,16,@tbname)
RETURN
END
IF OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTable')=0
AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsView')=0
AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTableFunction')=0
BEGIN
RAISERROR(N'"%s"不是表、视图或者表值函数',1,16,@tbname)
RETURN
END

--分页字段检查
IF ISNULL(@FieldKey,N'')=''
BEGIN
RAISERROR(N'分页处理需要主键(或者惟一键)',1,16)
RETURN
END

--其他参数检查及规范
IF ISNULL(@PageCurrent,0)<1 SET @PageCurrent=1
IF ISNULL(@PageSize,0)<1 SET @PageSize=10
IF ISNULL(@FieldShow,N'')=N'' SET @FieldShow=N'*'
IF ISNULL(@FieldOrder,N'')=N''
SET @FieldOrder=N''
ELSE
SET @FieldOrder=N'ORDER BY '+LTRIM(@FieldOrder)
IF ISNULL(@Where,N'')=N''
SET @Where=N''
ELSE
SET @Where=N'WHERE ('+@Where+N')'

--如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值)
IF @PageCount IS NULL
BEGIN
SET @sql=N'SELECT @PageCount=COUNT(*)'
+N' FROM '+@tbname
+N' '+@Where
EXEC sp_executesql @sql,N'@PageCount int OUTPUT',@PageCount OUTPUT
SET @PageCount=(@PageCount+@PageSize-1)/@PageSize
END

--计算分页显示的TOPN值
DECLARE @TopN varchar(20),@TopN1 varchar(20)
SELECT @TopN=@PageSize,
@TopN1=@PageCurrent*@PageSize

--第一页直接显示
IF @PageCurrent=1
EXEC(N'SELECT TOP '+@TopN
+N' '+@FieldShow
+N' FROM '+@tbname
+N' '+@Where
+N' '+@FieldOrder)
ELSE
BEGIN
SELECT @PageCurrent=@TopN1,
@sql=N'SELECT @n=@n-1,@s=CASE WHEN @n<'+@TopN
+N' THEN @s+N'',''+QUOTENAME(RTRIM(CAST('+@FieldKey
+N' as varchar(8000))),N'''''''') ELSE N'''' END FROM '+@tbname
+N' '+@Where
+N' '+@FieldOrder
SET ROWCOUNT @PageCurrent
EXEC sp_executesql @sql,
N'@n int,@s nvarchar(4000) OUTPUT',
@PageCurrent,@sql OUTPUT
SET ROWCOUNT 0
IF @sql=N''
EXEC(N'SELECT TOP 0'
+N' '+@FieldShow
+N' FROM '+@tbname)
ELSE
BEGIN
SET @sql=STUFF(@sql,1,1,N'')
--执行查询
EXEC(N'SELECT TOP '+@TopN
+N' '+@FieldShow
+N' FROM '+@tbname
+N' WHERE '+@FieldKey
+N' IN('+@sql
+N') '+@FieldOrder)
END
END


--使用系统存储过程实现的通用分页存储过程(转自邹建)
CREATE PROC sp_PageView
@sql ntext, --要执行的sql语句
@PageCurrent int=1, --要显示的页码
@PageSize int=10, --每页的大小
@PageCount int OUTPUT --总页数
AS
SET NOCOUNT ON
DECLARE @p1 int
--初始化分页游标
EXEC sp_cursoropen
@cursor=@p1 OUTPUT,
@stmt=@sql,
@scrollopt=1,
@ccopt=1,
@rowcount=@PageCount OUTPUT

--计算总页数
IF ISNULL(@PageSize,0)<1
SET @PageSize=10
SET @PageCount=(@PageCount+@PageSize-1)/@PageSize
IF ISNULL(@PageCurrent,0)<1 OR ISNULL(@PageCurrent,0)>@PageCount
SET @PageCurrent=1
ELSE
SET @PageCurrent=(@PageCurrent-1)*@PageSize+1

--显示指定页的数据
EXEC sp_cursorfetch @p1,16,@PageCurrent,@PageSize

--关闭分页游标
EXEC sp_cursorclose @p1
zeng_84_long 2009-03-25
  • 打赏
  • 举报
回复
表结构是
CREATE TABLE MST06
(
MST06000 VARCHAR2(8 BYTE),
MST06001 DATE,
MST06002 VARCHAR2(15 BYTE),
MST06003 VARCHAR2(16 BYTE),
MST06004 DATE,
MST06005 VARCHAR2(15 BYTE),
MST06006 VARCHAR2(16 BYTE),
MST06007 VARCHAR2(30 BYTE) NOT NULL,
MST06008 VARCHAR2(50 BYTE),
MST06009 VARCHAR2(20 BYTE),
MST06010 NUMBER(3),
MST06011 VARCHAR2(100 BYTE)
)
主要是用来数据库分页。
dawugui 2009-03-25
  • 打赏
  • 举报
回复
请给出表结构,测试数据,具体算法和结果,谢谢。

22,222

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧