Sybase_2

轉自:http://blog.csdn.net/Didizyp/archive/2007/07/12/1687298.aspx

 

使用存儲過程插入數據示例:
CREATE PROCEDURE dbo.p_insert
@bookname   nvarchar(50),
@bookauthor nvarchar(10),
@mesg       nvarchar(200) = 'ok' output
AS
BEGIN
     declare @bookcode nvarchar(10)

    --使用月、日、時、分、秒組成bookcode
    select @bookcode = convert(nvarchar(10), datepart(mm,getdate())*100000000 + datepart(dd,getdate())*1000000 + datepart(hh,getdate())*10000 + datepart(mi,getdate())*100 + datepart(ss,getdate()))
   
    --插入數據到book表
    insert into book (bookcode, bookname, bookauthor) values (@bookcode, @bookname, @bookauthor)
    if @@error <> 0 --異常處理
    begin
         select @mesg = '新增數據異常!' + convert(nvarchar(3), @@error)
         rollback    --事務回滾
        return -1
    end

    commit --事務提交
    return 0
END
執行:在Interactive SQL中嘗試執行以下代碼調用p_insert存儲過程:
     declare @mesg nvarchar(200),
                    @flag int
     exec @flag = p_insert 'NUnit學習筆記', '0000000001', @mesg output
     if @flag <> 0
     begin
         print @mesg
     end
     else
     begin
         print '程序運行正常!'
     end
     go

     使用存儲過程修改數據示例:
CREATE PROCEDURE dbo.p_update
@bookcode   nvarchar(10),
@bookname   nvarchar(50),
@bookauthor nvarchar(10)
AS
BEGIN
     update book set bookname = @bookname, bookauthor = @bookauthor where bookcode = @bookcode
END

     使用存儲過程刪除數據示例:
CREATE PROCEDURE dbo.p_delete
@bookcode nvarchar(10)
AS
BEGIN
     delete book where bookcode = @bookcode
END

     如果想刪掉存儲過程,只要選中simple_query,右鍵,點擊Delete,或者在Interactive SQL 中執行命令:
     drop procedure dbo.simple_query
即可。
6.創建觸發器
     觸發器是因某一行爲而自動做出反應並進行特定操作的一組SQL語句,可以理解爲表的事件。例如在對錶進行插入、修改或刪除數據等操作時,都會導致觸發器被觸發。這裏我會創建三個觸發器,分別對應book表的插入、修改和刪除操作。

     insert觸發器:
     在Sybase Central的Folders中找到zhengTest->User Tables->book->Triggers並選中,然後在Details中雙擊“Add Trigger(Wizard)”,打開“Add Trigger”嚮導。在第一個界面中填寫觸發器名稱,例如t_insert,點擊Next;在第二個界面中選擇Insert,點擊Next;在第三個界面中輸入代碼:
CREATE TRIGGER dbo.t_insert ON dbo.book
     For INSERT AS
BEGIN
     declare @bookcode   nvarchar(10),
                    @bookname   nvarchar(50),
                    @bookauthor nvarchar(20)
    select @bookcode = bookcode, @bookname = bookname, @bookauthor = bookauthor from inserted

    print '編號:%1!|名稱:%2!|作者:%3!', @bookcode, @bookname, @bookauthor
END
點擊Finish。至此,insert觸發器創建完畢。
     觸發器其實也可以認爲是一種存儲過程,就像我們在VB、VC、Delphi、Swing等開發中寫的事件處理方法一樣,只不過這個存儲過程即沒有參數,也沒有返回值,更不允許返回結果集,例如select * from book這種語句是絕對不能寫到觸發器中的。此外,觸發器中有兩個邏輯表,inserted和deleted,前者代表新插入或更新的值,後者代表數據表中已存在並將被更新掉或刪除掉的值,這裏用到了inserted。下面趕緊向book表中插入一條數據,看看效果吧!

     update觸發器,代碼:
CREATE TRIGGER dbo.t_update ON dbo.book
     For UPDATE AS
BEGIN
     IF UPDATE (bookname)
     BEGIN
         rollback transaction
     END

     declare @o_mesg nvarchar(100),
                    @ret int
     exec @ret = dbo.simple_demo 'N', @o_mesg output
     print '%1!--------%2!', @ret, @o_mesg
END
這裏需要說明的是IF UPDATE (bookname),該語句判斷bookname字段是否被更新,在這裏,bookname被更新便會導致回滾,即數據永遠無法通過update bookname字段的方式更改。當有多個字段需要作這種判斷時,只要寫作“IF UPDATE(bookcode) and|or UPDATE(bookname)”即可。此外,邏輯表inserted、deleted在update觸發器中同樣有效,相關說明請見insert觸發器。

     delete觸發器,代碼:
CREATE TRIGGER dbo.t_delete ON dbo.book
     For DELETE AS
BEGIN
     declare @bc nvarchar(10)
                  ,@bn nvarchar(50)
                  ,@ba nvarchar(10)
     --定義遊標
     declare del_curs cursor for
         select bookcode, bookname, bookauthor
         from deleted
         order by bookcode

     open del_curs --打開遊標

     --循環遊標讀取數據
     fetch del_curs into @bc, @bn, @ba
     while (@@sqlstatus = 0)
     begin
         print '編號:%1!|名稱:%2!|作者:%3!', @bc, @bn, @ba
         fetch del_curs into @bc, @bn, @ba
     end

     close del_curs --關閉遊標
     deallocate cursor del_curs --釋放遊標
END
這裏使用了邏輯表deleted和遊標來查詢被刪除的數據。

     注意,insert、update、delete觸發器在每張表中都只允許創建一個,如果再次創建,例如insert觸發器,無論使用什麼名字,如test_trigger,之前創建的insert觸發器都會被覆蓋掉。此外,Sybase也允許在一個觸發器中指定多個操作,例如:
CREATE TRIGGER dbo.t_author ON dbo.author
For INSERT, DELETE, UPDATE AS
BEGIN
    print 'author表的觸發器被執行!'
END
這個觸發器就同時被指定了insert、update和delete操作。
     此外,我們還可以指定觸發器失效或者有效,只要選中觸發器,右鍵,點擊Disable/Enable,或者在Interactive SQL 中執行命令:
     alter table dbo.book disable| enable trigger dbo.t_insert
即可。
     如果想刪掉觸發器,只要選中觸發器,右鍵,點擊Delete,或者在Interactive SQL 中執行命令:
     drop trigger dbo.t_insert
即可。
三、使用Java訪問Sybase
     我寫了兩個Java訪問Sybase的例子,IDE任意,驅動位於${Sybase安裝目錄}/jConnect-6_0/devclasses下, 將文件jconn3d.jar引入即可。

     第一個例子的代碼如下:
package net.test.db.sybase;

import java.sql.*;

public class TestQuery {

public static void main(String[] args) {
      Connection cn = null;
      CallableStatement cs = null;
      ResultSet rs = null;

      try {
         // 初始化連接對象
         Class.forName("com.sybase.jdbc3.jdbc.SybDriver");
         cn = DriverManager.getConnection("jdbc:sybase:Tds:image:5000/zhengTest?charset=cp936&jconnect_version=3", "sa", "");

         cs = cn.prepareCall("{call simple_query()}"); // 獲得聲明對象

         rs = cs.executeQuery(); // 執行,當有結果集時使用executeQuery()方法執行

         while (rs.next()) {
             System.out.print("編號:" + rs.getString(1));
             System.out.print("|名稱:" + rs.getString(2));
             System.out.println("|作者:" + rs.getString(3));
         }

         if (rs != null)
             rs.close(); //關閉結果集
         if (cs != null)
             cs.close(); // 關閉聲明
         if (cn != null)
             cn.close(); // 關閉連接
     } catch (Exception ex) {
         ex.printStackTrace();
     } finally {
         rs = null;
         cs = null;
         cn = null;
     }
}
}
這個例子演示的是如何訪問存儲過程simple_query,該存儲過程會返回一個結果集。這裏需要注意兩點:由於simple_query會返回一個結果集,因此需要使用cs.executeQuery()方法執行;在設置連接字符串的時候,設置了charset=cp936,即將客戶端的字符集設置成cp936,這樣查看結果時纔不會亂碼。

     第二個例子的代碼如下:
package net.test.db.sybase;

import java.sql.*;

public class TestDemo {

public static void main(String[] args) {
   Connection cn = null;
   CallableStatement cs = null;

   try {
    // 初始化連接對象
    Class.forName("com.sybase.jdbc3.jdbc.SybDriver");
    cn = DriverManager.getConnection("jdbc:sybase:Tds:image:5000/zhengTest?charset=cp936&jconnect_version=3","sa", "");

    cs = cn.prepareCall("{?=call simple_demo(?,?)}"); // 獲得聲明對象

    // 設置參數
    cs.registerOutParameter(1, Types.INTEGER);
    cs.setString(2, "N");
    cs.registerOutParameter(3, Types.VARCHAR);

    cs.execute(); // 執行,當沒有返回結果集時,爲防止出錯,使用execute()方法作執行

    // 輸出處理結果
    System.out.println(cs.getInt(1));
    System.out.println(cs.getString(3));

    if (cs != null)
     cs.close(); // 關閉聲明
    if (cn != null)
     cn.close(); // 關閉連接
   } catch (Exception ex) {
    ex.printStackTrace();
   } finally {
    cs = null;
    cn = null;
   }
}
}
這個例子演示的是動態訪問存儲過程simple_demo,該存儲過程帶有一個輸出參數,並有一個返回值,在JDBC中,返回值和輸出參數可以認爲是一回事。這裏需要注意的是,由於這個存儲過程沒有結果集,因此執行時應該使用cs.execute()方法。
四、使用VB.net/C#訪問Sybase
     我寫了兩個VB.net/C#訪問Sybase的例子,IDE使用SharpDevelop 2.1,環境爲.net Framework 2.0,驅動位於${Sybase安裝目錄}/DataAccess/ADONET/dll下, 引用其中的文件Sybase.Data.AseClient.dll到項目中即可。

     第一個例子的VB.net代碼如下:
Imports Sybase.Data.AseClient

Public Class TestQuery
Sub New()
   Dim cn As AseConnection = Nothing
   Dim cmd As AseCommand = Nothing
   Dim rd As AseDataReader = Nothing
   
   Try
    '初始化連接對象
    cn = New AseConnection("Data Source=image;Port=5000;UID=sa;PWD=;Database=zhengTest;CharSet=cp936;")
    
    cn.Open() '打開連接
    
    cmd = New AseCommand("exec simple_query", cn) '獲得命令對象
    
    rd = cmd.ExecuteReader() '執行,當有隻讀記錄集時使用ExecuteReader()方法執行

    While rd.Read()
     Console.Write("編號:" & rd.GetString(0))
     Console.Write("|名稱:" & rd.GetString(1))
     Console.WriteLine("|作者:" & rd.GetString(2))
    End While

    If rd IsNot Nothing Then
     rd.Close() '關閉只讀記錄集
    End If
    If cmd IsNot Nothing Then
     cmd.Dispose() '銷燬命令對象
    End If
    If cn IsNot Nothing Then
     cn.Close() '關閉連接對象
    End If
   Catch ex As AseException
    Console.WriteLine(ex.Message)
   Finally
    rd = Nothing
    cmd = Nothing
    cn = Nothing
   End Try
End Sub
End Class
     C#代碼如下:
using System;
using Sybase.Data.AseClient;

namespace zhengTest_Sybase
{
public class TestQuery
{
   public TestQuery()
   {
    AseConnection cn = null;
    AseCommand cmd = null;
    AseDataReader rd = null;
   
    try
    {
     //初始化連接對象
     cn = new AseConnection("Data Source=image;Port=5000;UID=sa;PWD=;Database=zhengTest;CharSet=cp936;");
    
     cn.Open(); //打開連接
    
     cmd = new AseCommand("exec simple_query", cn); //獲得命令對象
    
     rd = cmd.ExecuteReader(); //執行,當有隻讀記錄集時使用ExecuteReader()方法執行

     while(rd.Read())
     {
      Console.Write("編號:" + rd.GetString(0));
      Console.Write("|名稱:" + rd.GetString(1));
      Console.WriteLine("|作者:" + rd.GetString(2));
     }
    
     if (rd != null)
      rd.Close(); //關閉只讀記錄集
     if (cmd != null)
      cmd.Dispose(); //銷燬命令對象
     if (cn != null)
      cn.Close(); //關閉連接對象
    }
    catch( AseException ex )
    {
     Console.WriteLine(ex.Message);
    }
    finally
    {
     rd = null;
     cmd = null;
     cn = null;
    }
   }
}
}
跟第一個Java例子一樣,也是演示如何訪問simple_query存儲過程並對記錄集進行操作的。這裏請注意幾點:第一,連接字符串中Data Source=image指的不是數據源,而是服務器,與設置Server=image效果一樣;第二,連接字符串中的CharSet=cp936用來設置字符集,但從當前環境看,這個設置不是必須的,至於我是如何知道該參數有效的,我將字符集設置成cp850後出現亂碼了;第三,由於simple_query會返回一個結果集,因此需要使用ExecuteReader方法來執行,這點與Java很類似。

     第二個例子的VB.net代碼如下:
Imports System.Data
Imports Sybase.Data.AseClient

Public Class TestDemo
Sub New()
   Dim cn As AseConnection = Nothing
   Dim cmd As AseCommand = Nothing

   Try
    '初始化連接對象
    cn = New AseConnection("Data Source=image;Port=5000;UID=sa;PWD=;Database=zhengTest;")
   
    cn.Open()'打開連接
   
    cmd = New AseCommand("simple_demo", cn) '獲得命令對象
    cmd.CommandType = CommandType.StoredProcedure '設置命令類型爲存儲過程

    '設置參數
    cmd.Parameters.Add("RETURN_VALUE", AseDbType.[Integer]).Direction = ParameterDirection.ReturnValue
    cmd.Parameters.Add("@i_mesg", "N")
    cmd.Parameters.Add("@o_mesg", AseDbType.NVarChar, 50).Direction = ParameterDirection.Output

    cmd.ExecuteNonQuery() '執行,當沒有返回結果集時,使用ExecuteNonQuery()方法作執行

    '輸出處理結果
    Console.WriteLine(cmd.Parameters(0).Value)
    Console.WriteLine(cmd.Parameters(2).Value)

    If cmd IsNot Nothing Then
     cmd.Dispose() '銷燬命令對象
    End If
   
    If cn IsNot Nothing Then
     cn.Close() '關閉連接對象
    End If
   Catch ex As AseException
    Console.WriteLine(ex.Message)
   Finally
    cmd = Nothing
    cn = Nothing
   End Try
End Sub
End Class
     C#代碼如下:
using System;
using System.Data;
using Sybase.Data.AseClient;

namespace zhengTest_Sybase
{
public class TestDemo
{
   public TestDemo()
   {
    AseConnection cn = null;
    AseCommand cmd = null;
   
    try
    {
     //初始化連接對象
     cn = new AseConnection("Data Source=image;Port=5000;UID=sa;PWD=;Database=zhengTest;");
    
     cn.Open(); //打開連接
    
     cmd = new AseCommand("simple_demo", cn); //獲得命令對象
     cmd.CommandType = CommandType.StoredProcedure; //設置命令類型爲存儲過程
    
     //設置參數
     cmd.Parameters.Add("RETURN_VALUE", AseDbType.Integer).Direction = ParameterDirection.ReturnValue;
     cmd.Parameters.Add("@i_mesg", "N");
     cmd.Parameters.Add("@o_mesg", AseDbType.NVarChar, 50).Direction = ParameterDirection.Output;
    
     cmd.ExecuteNonQuery(); //執行,當沒有返回結果集時,使用ExecuteNonQuery()方法作執行
    
     //輸出處理結果
     Console.WriteLine(cmd.Parameters[0].Value);
     Console.WriteLine(cmd.Parameters[2].Value);
    
     if (cmd != null)
      cmd.Dispose(); //銷燬命令對象
     if (cn != null)
      cn.Close(); //關閉連接對象
    }
    catch( AseException ex )
    {
     Console.WriteLine(ex.Message);
    }
    finally
    {
     cmd = null;
     cn = null;
    }
   }
}
}
跟第二個Java例子類似,演示如何訪問simple_demo存儲過程。不過ADO.net調用存儲過程的方式與JDBC不同,只允許在命令對象中輸入過程名作爲語句,而且不支持“?”佔位符。關於參數設置中用到的RETURN_VALUE、@i_mesg、@o_mesg,分別代表simple_demo的返回值和兩個參數。由於simple_demo不會返回記錄集,因此需要使用ExecuteNonQuery方法來執行。這裏推薦一下文章《將存儲過程用於命令》,該文對ADO.net訪問存儲過程進行了比較詳細的介紹,從.net Framework自帶文檔或網上都能找到。

     另外,再提供兩個連接字符串:
     Sybase for OLED:PROVIDER=ASEOLEDB;Server=image;Port=5000;User Id=sa;Password=;Initial Catalog=zhengTest;CharSet=cp936;
請注意字符串中的Initial Catalog=zhengTest,表示要訪問我在Sybase中創建的zhengTest數據庫,而CharSet=cp936是用來設置字符集的,不設置會亂碼。
     Sybase for ODBC:DSN=zhengTest_Sybase;UID=sa;PWD=;CharSet=cp936;
字符串中的DSN=zhengTest_Sybase表示訪問我在ODBC中設置的數據源zhengTest_Sybase(如何在ODBC中設置數據源就不演示了),而CharSet=cp936也是用來設置字符集的,但在當前環境中不是必須的。
關於OLEDB和ODBC的使用,與示例類似,請參考其他ADO.net書籍或文檔。
五、使用Perl訪問Sybase
      我使用的Perl是5.8.8 build 820,雖然默認不帶數據庫訪問接口,但可以使用工具ppm下載到DBI。
      打開命令行工具,輸入ppm search dbi,查找dbi,有183個結果,我們需要的是第56個——DBI v1.57。下面執行命令ppm install dbi,如果提示錯誤,請嘗試ppm install 56,即安裝查詢結果中的第56個。不過安裝結束後,暫時還是無法使用DBI來連接數據庫,因爲DBI提供的只是一套數據庫接口,而不是數據庫驅動,因此還需要安裝dbd-ado和dbd-odbc,安裝方法同dbi。
     不過您或許已經注意到了,我使用的dbi版本不是最新的1.58,而且驅動也不是dbd-sybase,的確,因爲這些都沒有安裝包,只能從http://www.perl.com/CPAN/上下載源碼自己編譯。我自己倒是也做了不少嘗試,包括安裝FreeTDS,在cygwin和WinGW中make,結果都失敗了,自己推測原因大約是Perl和DBI、DBD-SYBASE之間版本不對應,畢竟這些東東每個版本接口都會有所變化。最後在經過一週的折磨之後,終於連編譯Ruby的dbd_sybase模塊的想法統統放棄了。

      這裏也是兩個例子。第一個例子的代碼如下:
use DBI;
#創建連接對象,類型爲ADO
$dbh=DBI->connect('DBI:ADO:PROVIDER=ASEOLEDB;Server=image;Port=5000;User Id=sa;Password=;Initial Catalog=zhengTest;CharSet=cp936;');

$sth=$dbh->prepare('exec simple_query' ); #獲得聲明對象
$sth->execute; #當有結果集時,使用execute方法

while (@row=$sth->fetchrow_array) {
print '編號:', $row[0];
print '|名稱:', $row[1];
print '|作者:', $row[2], "/n";
}

$sth->finish if $sth; #關閉聲明

$dbh->disconnect if $dbh; #斷開連接
也是演示如何訪問simple_query存儲過程並對結果集進行操作的。這裏請注意兩點:第一,本例使用的驅動類型爲ADO,其連接字符串中,Initial Catalog=zhengTest表示要訪問我在Sybase中創建的zhengTest數據庫,而CharSet=cp936則表示設置字符集爲cp936,目的在於避免亂碼;第二,由於simple_query會返回一個結果集,因此需要使用execute方法來執行,這點與前面很類似。

     第二個例子的代碼如下:
use DBI;
#創建連接對象,類型爲ODBC
$dbh=DBI->connect('DBI:ODBC:DSN=zhengTest_Sybase;UID=sa;PWD=;CharSet=cp936;');

$sql='{?=call simple_demo(?,?)}';
$ret='';
$msg='';

$sth=$dbh->prepare($sql); #獲得聲明對象

#設置參數
$sth->bind_param_inout(1, /$ret, 1);
$sth->bind_param(2, 'N');
$sth->bind_param_inout(3, /$msg, 100);

$sth->execute; #執行

#輸出處理結果
print $ret, "/n";
print $msg, "/n";

$sth->finish if $sth; #關閉聲明

$dbh->disconnect if $dbh; #斷開連接
也是演示動態訪問simple_demo存儲過程的。這裏需要注意的是,本例使用的驅動類型爲ODBC,其連接字符串中,DSN=zhengTest_Sybase表示訪問我在ODBC中設置的數據源zhengTest_Sybase,而CharSet=cp936則表示設置字符集爲cp936,這裏是必須的。
六、使用Ruby訪問Sybase
     我使用的Ruby是1.8.6-25,已安裝Rails 1.2.3。由於Ruby默認不帶數據庫訪問接口,因此請先從http://rubyforge.org/projects/ruby-dbi下載ruby-dbi,當前版本0.1.1。由於Ruby版本的DBI是從Perl版本演變過來的,因此兩者有很多相似之出。
     下載完dbi-0.1.1.tar.gz文件之後,解壓縮,在命令行中定位到解壓後的目錄下,例如F:/ruby-dbi,執行命令:
     ruby setup.rb config --with=dbi,dbd_ado,dbd_odbc
     ruby setup.rb setup
     ruby setup.rb install
此時dbi接口連帶dbd_ado、dbd_odbc驅動就都安裝到系統中了。
     據說dbi所提供的驅動僅是表層的,如果要使用還需要安裝底層驅動,例如PostgreSQL,就還需要安裝ruby-postgres。不過似乎是因爲我安裝了Rails的緣故(Rails帶有activerecord,據說裏邊包含了很多驅動),我在使用的過程中倒也沒被要求安裝底層驅動。
     此外,我也沒有使用dbd_sybase驅動。不知道爲什麼,dbd_sybase居然需要編譯,而我在cygwin和Windows命令行下都進行過嘗試,還安裝了MinGW(GCC的Windows版本),甚至查找了perl-dbi和freetds的資料,結果還是失敗。最可恨的是dbd_sybase調用的接口居然跟freetds和ruby中定義的接口不一致,後來看了dbd_sybase代碼才發現,居然是2001年的。最後,dbd_sybase到底沒裝上,可是make倒學會了。汗!

     這裏也是還個例子。第一個例子的代碼如下:
require 'dbi'
#創建連接對象,類型爲ADO
dbh=DBI.connect('DBI:ADO:PROVIDER=ASEOLEDB;Server=image;Port=5000;User Id=sa;Password=;Initial Catalog=zhengTest;CharSet=cp936;')

sth=dbh.prepare('exec simple_query') #獲得聲明對象
sth.execute #當有結果集時,使用execute方法

while row=sth.fetch do
print '編號:', row[0]
print '|名稱:', row[1]
print '|作者:', row[2], "/n"
end

sth.finish if sth #關閉聲明

dbh.disconnect if dbh #斷開連接

     第二個例子的代碼如下:
require 'dbi'
#創建連接對象,類型爲ODBC
dbh=DBI.connect('DBI:ODBC:DSN=zhengTest_Sybase;UID=sa;PWD=;CharSet=cp936;')

sql='{?=call simple_demo(?,?)}' #支持該代碼
ret=''
msg=''

sth=dbh.prepare(sql) #獲得聲明對象

#設置參數
sth.bind_param(1, ret)
sth.bind_param(2, 'N')
sth.bind_param(3, msg)

sth.execute #執行

#由於dbi不支持輸出參數,因此這裏無法獲取simple_demo的返回值與輸出參數

sth.finish if sth #關閉聲明

dbh.disconnect if dbh #斷開連接
演示動態訪問simple_demo存儲過程。不過由於dbi不支持存儲過程的輸出參數,注意是存儲過程,所以在這個示例中沒有獲取返回值的代碼。

     也不知道爲什麼,dbi只支持函數的輸出參數,而不支持存儲過程的輸出參數,似乎SQL Server和DB2的存儲過程也同樣無法返回輸出參數。
     由於本文只是使用Ruby訪問Sybase,因此沒打算對dbi作深入介紹。如果對dbi有興趣,建議在網上找一篇名爲《firstworks Programming with SQL Relay using the Ruby DBI API》的文章,雖然是英文的,但內容很全面,對多種數據庫都有介紹,值得一看。
     別告訴我你英文不好,我英文也不好,不也是用着金山詞霸就那麼看了嗎^_^
七、小結
     本文只是對Sybase操作的簡單介紹,像索引、序列這些都沒有作說明,而且給出的Java、.net、Perl和Ruby示例也都比較簡單,如果希望瞭解更多內容,還請參考其他書籍或文檔。
     此外,SQL Server與Sybase系出同門,大約是在Sybase 6的時候微軟不願再同Sybase公司合作而分成兩支的,因此如果手頭缺少Sybase資料,也不妨參考一下SQL Server的文檔。不過作爲一款大型數據庫,Sybase至今已發佈了15個大的版本,卻不知道爲什麼,在程序漢化和幫助文檔方面做得始終很差,而且提供的功能也很弱,像用戶自定義函數、try-catch語句和row_number函數這些,至今沒有,因此在使用SQL Server文檔的時候,如果發現某些功能在Sybase中實現不了,請不要奇怪。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章