獲取SQL-Server表的主關(guān)鍵字

字號(hào):

我們用SQL Server表作為數(shù)據(jù)源創(chuàng)建遠(yuǎn)程視圖時(shí), Visual FoxPro 會(huì)自動(dòng)把組成主索引關(guān)鍵字的字段的KeyField(關(guān)鍵字段)屬性設(shè)為真( .T. )。如何通過(guò)程序獲取主鍵的信息,以取得主鍵結(jié)構(gòu)的詳細(xì)內(nèi)容呢?我們可以使用存儲(chǔ)過(guò)程 sp—pkeys 來(lái)獲取。
    SQL Server的存儲(chǔ)過(guò)程 sp—pkeys 可以返回標(biāo)明主鍵(PRIMARY KEY)設(shè)置的字段的信息。sp—pkeys 與 ODBC 中的SQLPrimaryKeys 功能相同。返回的結(jié)果按 TABLE—QUALIFIER, TABLE—OWNER, TABLE—NAME, KEY—SEQ的順序排列,返回的cursor的結(jié)構(gòu)如表1。
    以下例程演示了sp—pkeys的具體應(yīng)用方法:
    * GETKeys.prg
    *實(shí)用時(shí)請(qǐng)用實(shí)際服務(wù)器名代替下面的服務(wù)器名
    #DEFINE Connect—String ′DRIVER={SQL Server};SERVER=MY—SERVER;′ + ;
    ′DATABASE=PUBS;UID=sa;PWD=′
    * 創(chuàng)建一個(gè)保存信息的 cursor
    CREATE CURSOR SQLKeys (Table—Name C(128), Column—Name C(128), ;
    Key—Seq I, PK—Name C(128))
    * 連接 SQL Server
    gnConnHandle=SQLSTRINGCONN(Connect—String)
    IF gnConnHandle>0
    * 取得SQL Server中可以使用的表數(shù)目
    SQLConnTables=SQLTABLES(gnConnHandle)
    IF SQLConnTables>0
    SELECT SQLResult
    INCnt=0
    DO WHILE !EOF()
    * 創(chuàng)建一個(gè)執(zhí)行存儲(chǔ)過(guò)程的命令字符串
    SQLCommand=″sp—pkeys ″+ ALLTRIM(Table—Name)
    * 執(zhí)行存儲(chǔ)過(guò)程,向cursor返回?cái)?shù)據(jù)
    =SQLEXEC(gnConnHandle,SQLCommand,′syskeys′)
    * 轉(zhuǎn)到cursor 所在工作區(qū)
    SELECT SYSKeys
    IF RECCOUNT()>0
    SCAN
    IF RECNO()=1
    * 向 SQLKeys cursor 中插入新記錄
    INSERT INTO SQLKeys ;
    VALUES ;
    (SYSKeys.Table—Name, SYSKeys.Column—Name, ;
    SYSKeys.Key—Seq,SYSKeys.PK—Name)
    ELSE
    * 多字段主鍵
    * 連接多字段形成索引表達(dá)式
    SQLKeys.Column—Name WITH ;
    ALLTRIM(SQLKeys.Column—Name) + ;
    ″+″ + ALLTRIM(SYSKeys.Column—Name)
    ENDIF
    ENDSCAN
    ENDIF
    SELECT SQLResult
    SKIP
    ENDDO
    =SQLDISCONN(gnConnHandle)
    ENDIF
    ENDIF
    SELECT SQLKeys
    BROW LAST
    CLOSE ALL
    RETURN
    以上程序適用于VFP 3.0以上各版本。
    表1 字段名 說(shuō) 明
    table_qualifier 表約束器的名稱(chēng),就是表所屬的數(shù)據(jù)庫(kù)的名稱(chēng),可以返回空值null。
    table_owner 表所有者的名稱(chēng)。代表創(chuàng)建這個(gè)表的數(shù)據(jù)庫(kù)用戶的名稱(chēng),該字段總有返回值。
    table_name 表的名稱(chēng)。該字段總有返回值。
    column_name 字段名,包括table—name字段返回的表中的所有字段。本字段的內(nèi)容是在系統(tǒng)字段表(syscolumns)中登記的字段名,并且總有返回值。如果一個(gè)主鍵由多個(gè)字段組成,sp—pkeys會(huì)為組成主鍵索引表達(dá)式的每個(gè)字段都返回一行記錄。
    key_seq 該字段在一個(gè)多字段主鍵中的順序編號(hào),總有返回值。
    pk_name 主鍵標(biāo)識(shí)。如果它不適用于數(shù)據(jù)源,則返回空值null。