樓主的語(yǔ)句本來(lái)就運(yùn)行不了,上邊那個(gè)瞎復(fù)制,都不運(yùn)行一遍發(fā)什么發(fā)。oracle和sqlserver下運(yùn)行語(yǔ)句如下:
成都創(chuàng)新互聯(lián)公司:于2013年創(chuàng)立為各行業(yè)開(kāi)拓出企業(yè)自己的“網(wǎng)站建設(shè)”服務(wù),為1000多家公司企業(yè)提供了專業(yè)的網(wǎng)站制作、網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)和網(wǎng)站推廣服務(wù), 按需定制由設(shè)計(jì)師親自精心設(shè)計(jì),設(shè)計(jì)的效果完全按照客戶的要求,并適當(dāng)?shù)奶岢龊侠淼慕ㄗh,擁有的視覺(jué)效果,策劃師分析客戶的同行競(jìng)爭(zhēng)對(duì)手,根據(jù)客戶的實(shí)際情況給出合理的網(wǎng)站構(gòu)架,制作客戶同行業(yè)具有領(lǐng)先地位的。
select?a.ticket_id,a.txn_station,b.txn_station?from?
(select?row_number()?over?(partition?by?ticket_id?order?by?txn_time)?rn,subway.*?from?subway)?a,
(select?row_number()?over?(partition?by?ticket_id?order?by?txn_time)?rn,subway.*?from?subway)?b
where?a.ticket_id=b.ticket_id?and?a.trans_code=0?and?b.trans_code=1?and?a.txn_stationb.txn_station?and?a.rn=b.rn-1
order?by?a.ticket_id
結(jié)果:
其他數(shù)據(jù)庫(kù)另外說(shuō)明
簡(jiǎn)介
我最近參與了將一個(gè)Sybase數(shù)據(jù)庫(kù)移植到MicrosoftSQLServer
2000上的項(xiàng)目,我在這一項(xiàng)目上獲得的經(jīng)驗(yàn),將對(duì)Sybase數(shù)據(jù)庫(kù)管理員把Sybase數(shù)據(jù)庫(kù)移植到SQLServer2000平臺(tái)上有一定的幫助。
盡管二者之間的一些差別是相當(dāng)大的,例如Sybase數(shù)據(jù)庫(kù)管理系統(tǒng)中的存儲(chǔ)過(guò)程在SQL
Server就不能被編譯,而其它差別則不太大。在完成這一轉(zhuǎn)換前,對(duì)腳本文件和存儲(chǔ)過(guò)程中編程邏輯的行為和結(jié)果進(jìn)行測(cè)試是很有必要的。
在下面的部分中,我們將討論這二種數(shù)據(jù)庫(kù)系統(tǒng)之間的一些主要的不同點(diǎn),在移植的規(guī)劃階段,我們必須仔細(xì)研究這些區(qū)別。
數(shù)據(jù)兼容模式
對(duì)SQLServer2000和Sybase之間的一些兼容性差別的一個(gè)臨時(shí)性解決方案是改變SQL
Server中的數(shù)據(jù)庫(kù)兼容性級(jí)別,使之與Sybase相符。為此,我們可以使用sp_dbcmptlevel存儲(chǔ)過(guò)程。
下面表中的語(yǔ)句和結(jié)果顯示出不同版本數(shù)據(jù)庫(kù)之間的差別:
(Untitled-1)
注意:
1、當(dāng)兼容性模式被設(shè)置為70時(shí),下面的詞匯不能被用作對(duì)象名和標(biāo)識(shí)符:BACKUP、DENY、PRECENT、RESTORE和TOP。
2、當(dāng)兼容性模式被設(shè)置為65時(shí),下面的詞匯不能被用作對(duì)象名和標(biāo)識(shí)符:AUTHORIZATION、CASCASE、CROSS、 DISTRIBUTED、ESCAPE、FULL、INNER、JOIN、LEFT、OUTER、PRIVILEGES、RESTRICT、RIGHT、 SCHEMA和WORK。
下面是sp_dbcmptlevel的語(yǔ)法:
sp_dbcmptlevel[[@dbname=]name][,[@new_cmptlevel=]version]
@dbname是用于檢查和改變兼容性水平的數(shù)據(jù)庫(kù)名字。
@new_cmptlevel決定數(shù)據(jù)庫(kù)被設(shè)置的兼容性水平(將它設(shè)置為70、65、60,缺省值為NULL)。
例如:
sp_dbcmptlevelpubs
這一行代碼返回下面的結(jié)果:
Thecurrentcompatibilitylevelis70.(當(dāng)前的兼容性級(jí)別為70。)
現(xiàn)在我們來(lái)看一下另外一個(gè)例子:
sp_dbcmptlevelpubs,65
它返回如下的結(jié)果:
DBCCexecutioncompleted.(DBCC執(zhí)行結(jié)束。)
果DBCC打印出錯(cuò)誤信息,則需要與系統(tǒng)管理員聯(lián)系。我們可以使用rerunsp_dbcmptlevel驗(yàn)證pubs數(shù)據(jù)庫(kù)是否修改得正確:
sp_dbcmptlevelpubs
它返回下面的結(jié)果:
Thecurrentcompatibilitylevelis65(當(dāng)前的兼容性級(jí)別為65。)
除了上面的例子外,兼容性級(jí)別的差別還擴(kuò)展到了保留字。Sybase和SQL
Server都有許多不能被用作數(shù)據(jù)庫(kù)中對(duì)象名字的的保留字,二種產(chǎn)品的保留字相似,但并不完全相同。
由于能夠在Sybase中使用的對(duì)象可能不能在SQLServer中使用,這一問(wèn)題使得由Sybase向SQL
Server的移植憑添了許多困難。下面是在SQL
Server中是保留字,而在Sybase中不是保留字的詞匯清單。
注意:名字為下列清單中詞匯的Sybase數(shù)據(jù)庫(kù)中的對(duì)象在移植到SQL
Server數(shù)據(jù)庫(kù)時(shí)必須換為其它名字。
BACKUPCOLUMNCOMMITTEDCONTAINSCONTAINSTABLE
CROSSCURRENT_DATE
CURRENT_TIMECURRENT_TIMESTAMPCURRENT_USER
DENYDISTRIBUTEDFILEFLOPPY
FREETEXT
FREETEXTTABLEFULLIDENTITYCOLINNERJOIN
事務(wù)管理模式
SybaseSQLServer
Setchained[on:off]Setimplicit_transactions
[on:off]
在Sybase中使用下面的代碼判斷事務(wù)模式:
SELECT@@tranchained
GO
下面是可能返回的結(jié)果:
0表明使用的是非鏈鎖式事務(wù)模式
1表明連接運(yùn)行在鏈鎖模式下
在SQLServer中使用下面的代碼判斷事務(wù)模式:
IF(@@options2)0
on
ELSE
PRINToff
下面是可能的返回結(jié)果:
0off
0on
隔離水平
在一個(gè)關(guān)系數(shù)據(jù)庫(kù)這樣的多線程應(yīng)用軟件中,數(shù)據(jù)庫(kù)引擎對(duì)運(yùn)行的進(jìn)程間的數(shù)據(jù)是如何被隔離的管理是非常重要的,在表示隔離水平時(shí),Sybase和SQL
Server的語(yǔ)法是不同的。下面的表格表明了Sybase和SQLServer在表示隔離水平時(shí)的差別。
SybaseSQL
Server
0READUNCOMMITTED
1READCOMMITTED
2REPEATABLEREAD
3
SERIALIZABLE
游標(biāo)語(yǔ)法
二種產(chǎn)品中存儲(chǔ)過(guò)程的創(chuàng)建和執(zhí)行基本相似,但在移植時(shí),游標(biāo)語(yǔ)句中的一些例外是我們應(yīng)當(dāng)注意的。下面是一個(gè)例子:
CREATEPROCEDUREsql_cursorAS
DECLARE@lnamechar(20),@fname
char(20)
DECLAREmycursorCURSORFOR
SELECTau_lname,au_fnameFROM
authors
OPENmycursor
FETCHFROMmycursorINTO@lname,@fname
WHILE@@
FETCH_STATUS=0
/*Sybase數(shù)據(jù)庫(kù)使用@SQLSTATUS而不是@@FETCH_STATUS*/
BEGIN
FETCHFROMmycursorINTO@lname,@fname
/*
**
這里應(yīng)當(dāng)是一些業(yè)務(wù)邏輯
*/
END
CLOSEmycursor
DEALLOCATE/*
Sybase數(shù)據(jù)庫(kù)在這里需要CURSOR這個(gè)詞*/mycursor
SybaseSQLServer
Fetch命令執(zhí)行成功00
Fetch命令執(zhí)行失敗1-2
沒(méi)有可存取的記錄了2
-1
退回觸發(fā)器
SQLServer中不存在這個(gè)命令,因此在向SQL
Server移植時(shí),使用了ROLLBACKTRIGGER命令的Sybase存儲(chǔ)過(guò)程必須被進(jìn)行修改。在修改帶有觸發(fā)器的數(shù)據(jù)庫(kù)表中的數(shù)據(jù)時(shí),使用ROLLBACK
TRIGGER命令容易引起誤解,一個(gè)ROLLBACK
TRIGGER命令只退回觸發(fā)器以及觸發(fā)觸發(fā)器的數(shù)據(jù)修改,如果已經(jīng)被提交了,則事務(wù)的其它部分會(huì)繼續(xù),被寫(xiě)到數(shù)據(jù)庫(kù)中。因此,事務(wù)中的所有語(yǔ)句可能沒(méi)有被成功地完成,但數(shù)據(jù)已經(jīng)被提交了。
下面是Sybase數(shù)據(jù)庫(kù)中一個(gè)使用ROLLBACK
TRIGGER的樣例觸發(fā)器:
CREATETABLEtable1(aint,bint)
GO
CREATETRIGGERtrigger1ontable1
FORINSERT
AS
IFEXISTS(SELECT1FROMinsertedWHEREa=
100)
BEGIN
ROLLBACKTRIGGERwithRAISERROR50000Invalidvalueforcolumn
a
END
INSERTINTOtable2
SELECTa,GETDATE()from
inserted
RETURN
GO
在上面的代碼中,除非a=100,則所有插入table1的數(shù)據(jù)也被作為審計(jì)行插入table2中,如果a=100,ROLLBACK
TRIGGER命令被觸發(fā),而INSERT命令沒(méi)有被觸發(fā),批命令的其它部分繼續(xù)執(zhí)行,這時(shí)會(huì)出現(xiàn)錯(cuò)誤信息,表明在一個(gè)INSERT命令中出現(xiàn)了錯(cuò)誤。下面是所有的INSERT命令:
BEGINTRAN
INSERTINTOtable1VALUES(1,1)
INSERTINTOtable1VALUES
(100,2)
INSERTINTOtable1VALUES(3,3)
GO
SELECT*FROMtable1
在執(zhí)行這些命令后,table1和table2二個(gè)數(shù)據(jù)庫(kù)表將各有2個(gè)記錄,Table1表中的值為1,1以及3,3,由于ROLLBACK
TRIGGER命令,第二個(gè)INSERT命令沒(méi)有執(zhí)行;Table2表中的值為1,(當(dāng)前日期)以及3,(當(dāng)前日期),由于當(dāng)a=100時(shí)ROLLBACK
TRIGGER被觸發(fā),觸發(fā)器中的所有處理被中止,100沒(méi)有被插入到Table2表中。
在SQL
Server中模擬這一操作需要更多的代碼,外部的事務(wù)必須與保存點(diǎn)同時(shí)使用,如下所示:
CREATEtrigger1ontable1FOR
INSERT
AS
SAVETRANtrigger1
IFEXISTS(SELECT*FROMinsertedWHEREa
=100)
BEGIN
ROLLBACKTRANtrigger1
RAISERROR50000
ROLLBACK
END
INSERTINTOtable2
SELECTa,GETDATE()FROM
inserted
GO
這一觸發(fā)器以一個(gè)存儲(chǔ)點(diǎn)開(kāi)始,ROLLBACKTRANSACTION只退回觸發(fā)邏輯,而不是整個(gè)事務(wù)(規(guī)模要小于Sybases數(shù)據(jù)庫(kù)中的ROLLBACK
TRIGGER語(yǔ)句。對(duì)批命令的修改如下:
BEGINTRAN
SAVETRANsave1
INSERTINTOtable1
VALUES(1,1)
IF@@error=50000
ROLLBACKTRANsave1
SAVETRAN
save2
INSERTINTOtable1VALUES(100,1)
IF@@error=50000
ROLLBACK
TRANsave2
SAVETRANsave3
INSERTINTOtable1VALUES(3,3)
IF@@error
=50000
ROLLBACKTRANsave3
COMMITTRAN
我們可以發(fā)現(xiàn),改變不可謂不大。由于ROLLBACKTRIGGER命令能夠使任何批命令不能成功執(zhí)行,因此在移植的SQL
Server存儲(chǔ)過(guò)程代碼中必須包括另外的邏輯,根據(jù)ROLLBACK
TRIGGER的使用,這可能是一個(gè)艱巨而必要的任務(wù),沒(méi)有什么捷徑可走。如果在移植后所有的ROLLBACKTRIGGER命令被改變?yōu)镽OLLBACK
TRANSACTION,觸發(fā)器的執(zhí)行也會(huì)發(fā)生變化,因此我們應(yīng)當(dāng)十分小心。
命令優(yōu)化
SQL
Server能夠?qū)ELECT、INSERT、UPDATE和DELETE命令進(jìn)行優(yōu)化,Sybase數(shù)據(jù)庫(kù)則只支持對(duì)SELECT命令進(jìn)行優(yōu)化。下面是SQL
Server和Sybase在GUI方面的對(duì)比:
SybaseSQL
Server
使用被稱作SHOWPLAN的基于文本的查詢分析工具使用Query
Analyzer。
在ISQL中啟動(dòng)SHOWPLAN的命令按鈕多QueryAnalyzer中啟動(dòng)SHOWPLAN_ALL或
SHOWPLAN_TEXT的命令
SETSHOWPLANONSETSHOWPLAN_ALL
GOGO
臨時(shí)數(shù)據(jù)庫(kù)表的名字
表名字的類型 最大長(zhǎng)度
SQLServer表名字 128
SQL
Server臨時(shí)表名字 116
Sybase表名字 30
Sybase臨時(shí)表名字 13
數(shù)據(jù)類型
數(shù)據(jù)類型SybaseSQLServer
char(n)2558000
varchar(n)255
8000
nchar(n)2554000
nvarchar(n)2554000
binary255
8000
varbinary2558000
注意:
1)SQL
Server中的bit類型數(shù)據(jù)的值可以被設(shè)置為0、1或NULL。
2)Sybase中的bit類型數(shù)據(jù)的值不可以被設(shè)置為NULL。
同一性列
SybaseSQLServer
Numeric(x,0)Tinyint,smallint,int,decimal(x,0)or
numeric(x,0)
打印語(yǔ)法
在進(jìn)行移植時(shí),所有使用替換語(yǔ)法的打印語(yǔ)句必須被改變?yōu)镽AISERROR語(yǔ)句。
結(jié)論
將Sybase數(shù)據(jù)庫(kù)轉(zhuǎn)換為SQL
Server數(shù)據(jù)庫(kù)并非是不可能的,但二種產(chǎn)品之間存在許多差異,在轉(zhuǎn)換時(shí)需要加以解決。根據(jù)應(yīng)用程序的規(guī)模,這種轉(zhuǎn)換可能需要大量的時(shí)間。盡管無(wú)需重新編寫(xiě)所有的應(yīng)用程序,但需要完成的工作并不少。
我目前還沒(méi)有發(fā)現(xiàn)這二種數(shù)據(jù)庫(kù)間轉(zhuǎn)換的更簡(jiǎn)單的方法。由于二種產(chǎn)品在許多方面都非常相似,我們非常容易成功地將Sybase數(shù)據(jù)庫(kù)轉(zhuǎn)換為SQL
Server數(shù)據(jù)。
網(wǎng)上其實(shí)很多相關(guān)文章,你可以搜一下,并不一定需要在這里提問(wèn)。
轉(zhuǎn)帖一篇給你吧
drop table #Tmp --刪除臨時(shí)表#Tmp
create table #Tmp --創(chuàng)建臨時(shí)表#Tmp
(
ID int IDENTITY (1,1) not null, --創(chuàng)建列ID,并且每次新增一條記錄就會(huì)加1
WokNo varchar(50),
primary key (ID) --定義ID為臨時(shí)表#Tmp的主鍵
);
Select * from #Tmp --查詢臨時(shí)表的數(shù)據(jù)
truncate table #Tmp --清空臨時(shí)表的所有數(shù)據(jù)和約束
相關(guān)例子:
Declare @Wokno Varchar(500) --用來(lái)記錄職工號(hào)
Declare @Str NVarchar(4000) --用來(lái)存放查詢語(yǔ)句
Declare @Count int --求出總記錄數(shù)
Declare @i int
Set @i = 0
Select @Count = Count(Distinct(Wokno)) from #Tmp
While @i @Count
Begin
Set @Str = 'Select top 1 @Wokno = WokNo from #Tmp Where id not in (Select top ' + Str(@i) + 'id from #Tmp)'
Exec Sp_ExecuteSql @Str,N'@WokNo Varchar(500) OutPut',@WokNo Output
Select @WokNo,@i --一行一行把職工號(hào)顯示出來(lái)
Set @i = @i + 1
End
臨時(shí)表
可以創(chuàng)建本地和全局臨時(shí)表。本地臨時(shí)表僅在當(dāng)前會(huì)話中可見(jiàn);全局臨時(shí)表在所有會(huì)話中都可見(jiàn)。
本地臨時(shí)表的名稱前面有一個(gè)編號(hào)符 (#table_name),而全局臨時(shí)表的名稱前面有兩個(gè)編號(hào)符 (##table_name)。
SQL 語(yǔ)句使用 CREATE TABLE 語(yǔ)句中為 table_name 指定的名稱引用臨時(shí)表:
CREATE TABLE #MyTempTable (cola INT PRIMARY KEY)
INSERT INTO #MyTempTable VALUES (1)
如果本地臨時(shí)表由存儲(chǔ)過(guò)程創(chuàng)建或由多個(gè)用戶同時(shí)執(zhí)行的應(yīng)用程序創(chuàng)建,則 SQL Server 必須能夠區(qū)分由不同用戶創(chuàng)建的表。為此,SQL
Server 在內(nèi)部為每個(gè)本地臨時(shí)表的表名追加一個(gè)數(shù)字后綴。存儲(chǔ)在 tempdb 數(shù)據(jù)庫(kù)的 sysobjects 表中的臨時(shí)表,其全名由
CREATE TABLE 語(yǔ)句中指定的表名和系統(tǒng)生成的數(shù)字后綴組成。為了允許追加后綴,為本地臨時(shí)表指定的表名 table_name 不能超過(guò)
116 個(gè)字符。
除非使用 DROP TABLE 語(yǔ)句顯式除去臨時(shí)表,否則臨時(shí)表將在退出其作用域時(shí)由系統(tǒng)自動(dòng)除去:
當(dāng)存儲(chǔ)過(guò)程完成時(shí),將自動(dòng)除去在存儲(chǔ)過(guò)程中創(chuàng)建的本地臨時(shí)表。由創(chuàng)建表的存儲(chǔ)過(guò)程執(zhí)行的所有嵌套存儲(chǔ)過(guò)程都可以引用此表。但調(diào)用創(chuàng)建此表的存儲(chǔ)過(guò)程的進(jìn)程無(wú)法引用此表。
所有其它本地臨時(shí)表在當(dāng)前會(huì)話結(jié)束時(shí)自動(dòng)除去。
全局臨時(shí)表在創(chuàng)建此表的會(huì)話結(jié)束且其它任務(wù)停止對(duì)其引用時(shí)自動(dòng)除去。任務(wù)與表之間的關(guān)聯(lián)只在單個(gè) Transact-SQL 語(yǔ)句的生存周期內(nèi)保持。換言之,當(dāng)創(chuàng)建全局臨時(shí)表的會(huì)話結(jié)束時(shí),最后一條引用此表的 Transact-SQL 語(yǔ)句完成后,將自動(dòng)除去此表。
在
存儲(chǔ)過(guò)程或觸發(fā)器中創(chuàng)建的本地臨時(shí)表與在調(diào)用存儲(chǔ)過(guò)程或觸發(fā)器之前創(chuàng)建的同名臨時(shí)表不同。如果查詢引用臨時(shí)表,而同時(shí)有兩個(gè)同名的臨時(shí)表,則不定義針對(duì)哪
個(gè)表解析該查詢。嵌套存儲(chǔ)過(guò)程同樣可以創(chuàng)建與調(diào)用它的存儲(chǔ)過(guò)程所創(chuàng)建的臨時(shí)表同名的臨時(shí)表。嵌套存儲(chǔ)過(guò)程中對(duì)表名的所有引用都被解釋為是針對(duì)該嵌套過(guò)程所
創(chuàng)建的表,例如:
CREATE PROCEDURE Test2
AS
CREATE TABLE #t(x INT PRIMARY KEY)
INSERT INTO #t VALUES (2)
SELECT Test2Col = x FROM #t
GO
CREATE PROCEDURE Test1
AS
CREATE TABLE #t(x INT PRIMARY KEY)
INSERT INTO #t VALUES (1)
SELECT Test1Col = x FROM #t
EXEC Test2
GO
CREATE TABLE #t(x INT PRIMARY KEY)
INSERT INTO #t VALUES (99)
GO
EXEC Test1
GO
下面是結(jié)果集:
(1 row(s) affected)
Test1Col
-----------
1
(1 row(s) affected)
Test2Col
-----------
2
當(dāng)創(chuàng)建本地或全局臨時(shí)表時(shí),CREATE TABLE 語(yǔ)法支持除 FOREIGN KEY 約束以外的其它所有約束定義。如果在臨時(shí)表中指定
FOREIGN KEY 約束,該語(yǔ)句將返回警告信息,指出此約束已被忽略,表仍會(huì)創(chuàng)建,但不具有 FOREIGN KEY 約束。在 FOREIGN
KEY 約束中不能引用臨時(shí)表。
考慮使用表變量而不使用臨時(shí)表。當(dāng)需要在臨時(shí)表上顯式地創(chuàng)建索引時(shí),或多個(gè)存儲(chǔ)過(guò)程或函數(shù)需要使用表值時(shí),臨時(shí)表很有用。通常,表變量提供更有效的查詢處理。