VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

SQL的預存程序

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
遊俠



註冊時間: 2006-04-06
文章: 1
來自: 台中

第 1 樓

發表發表於: 星期一 四月 17, 2006 12:44 pm    文章主題: SQL的預存程序 引言回覆

請問各位大大 如何在 VFP 內將 SQL的預存程序 寫到SQL Server內
有會用的教一下 謝謝大家........
回頂端
檢視會員個人資料 發送私人訊息
garfield
Site Admin


註冊時間: 2003-01-30
文章: 2160


第 2 樓

發表發表於: 星期二 四月 18, 2006 2:34 pm    文章主題: 引言回覆

沒用過,
但 MsSQL 的 Help 是這樣寫的.

CREATE PROCEDURE
建立一個預存程序,它是一個預存的Transact-SQL 陳述式集合體,可以接受及傳回使用者提供的參數。

程序可以建立供永久使用,也可以供某一工作階段暫時使用 (區域暫時性程序) 或者供所有工作階段暫時使用 (全域暫時性程序)。

預存程序也可以被建立為在 Microsoft® SQL Server™ 啟動時自動執行。

語法
CREATE PROC [ EDURE ] procedure_name [ ; number ]
[ { @parameter data_type }
[ VARYING ] [ = default ] [ OUTPUT ]
] [ ,...n ]

[ WITH
{ RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]

[ FOR REPLICATION ]

AS sql_statement [ ...n ]

引數
procedure_name

為新預存程序的名稱。程序名稱必須符合識別項規則,而且在資料庫中及對其擁有者都必須是唯一的。若需相關資訊,請參閱使用識別項。

建立區域或全域暫時性程序的方式為對於區域暫時性程序,請在 procedure_name 前面加一個數字符號 (#procedure_name),而全域暫時性程序則加兩個數字符號 (##procedure_name)。整個名稱 (包括 # 或 ##) 不得超過 128 個字元。指定程序擁有者名稱則是選擇性的。

;number

是一個用來群組同名稱程序的選擇性整數,讓這些程序能夠以一個 DROP PROCEDURE 陳述式一起被卸除。舉例來說,配合某一應用程式呼叫順序使用的程序可能被命名為 orderproc;1、orderproc;2,等依此類推。那麼陳述式 DROP PROCEDURE orderproc 便可卸除整個群組。如果名稱含有分隔識別項,則數字不可作為識別項的一部分;請在 procedure_name 前後只使用適當的分隔符號。

@parameter

程序的參數。在 CREATE PROCEDURE 陳述式中可以宣告一個或一個以上參數。每一個宣告的參數在程序執行時必須由使用者來提供值 (除非已定義了參數的預設值)。預存程序最多可以有 2.100 個參數。

指定參數名稱時請用 at 符號 (@) 作為第一個字元。參數名稱必須與識別項的規則一致。參數僅存在該程序區域中;相同的參數名稱也可以用在其他程序中。依預設值,參數只能取代常數;不能用來取代資料表名稱、資料行名稱或其他資料庫物件的名稱。若需詳細資訊,請參閱 EXECUTE。

data_type

為參數的資料型別。所有資料型別 (包括 text、ntext 和 image) 都可用作預存程序的參數。不過,cursor 資料型別僅可用於 OUTPUT 參數。當您指定 cursor 資料型別時,也必須指定 VARYING 和 OUTPUT 關鍵字。如需關於 SQL Server 所提供的資料型別及其語法的詳細資訊,請參閱資料型別。



附註 對於可以是 cursor 資料型別的輸出參數並沒有最大數量的限制。


VARYING

指定結果集被當做輸出參數支援 (由預存程序動態建構且其內容會變動)。僅適用於資料指標參數。

default

參數的預設值。如果定義了預設值,則不需為該參數指定值便可執行程序。預設值必須為常數否則可能是 NULL。如果程序是配合 LIKE 關鍵字使用該參數,那麼它就可以包括萬用字元 (%、_、[] 及 [^])。

OUTPUT

表示該參數為一傳回參數。這個選項的值可以被傳回到 EXEC[UTE]。使用 OUTPUT 參數將資訊傳回到呼叫的程序。Text、ntext 和 image 參數可以當做 OUTPUT 參數。使用 OUTPUT 關鍵字的輸出參數可以是資料指標替代符號。

n

是一個替代符號,表示最多可以指定 2.100 個參數。

{RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION}

RECOMPILE 表示 SQL Server 不會為此程序快取計劃,且此程序會在執行期間重新編譯。當使用典型或暫時值而不強制取代記憶體中快取的執行計劃時,請使用 RECOMPILE 選項。

ENCRYPTION 表示 SQL Server 會加密含有 CREATE PROCEDURE 陳述式文字的 syscomments 資料表項目。使用 ENCRYPTION 可防止程序被被當做 SQL Server 複本的一部分發行。



附註 在升級過程中,SQL Server 會使用儲存在 syscomments 中的加密註解來重新建立加密的程序。


FOR REPLICATION

指示建立作為複本的預存程序不可在「訂閱者」上執行。以 FOR REPLICATION 選項建立的預存程序是用作預存程序篩選器,而且只能在複寫過程中被執行。這個選項不能與 WITH RECOMPILE 選項一起使用。

AS

指定程序所要執行的動作。

sql_statement

要包括在程序中的任何 Transact-SQL 陳述式的數目或型別。不過還是有些限制。

n

是一個替代符號,用以表示可包含於此程序中的多個 Transact-SQL 陳述式。

備註
預存程序的最大大小為 128 MB。

使用者定義的預存程序只能建立在目前的資料庫中 (暫時性程序除外,它永遠是建立在 tempdb 中)。CREATE PROCEDURE 陳述式不能與其他Transact-SQL陳述式合併在單一批次處理中。

依預設值,參數可以是 Null。如果傳遞了一個 NULL 參數值而且該參數是使用於所參照資料行不允許 NULL 的 CREATE 或 ALTER TABLE 陳述式中,那麼 SQL Server 便會產生錯誤訊息。若要防止傳遞 NULL 參數值到不允許 NULL 的資料行,請在程序中增加程式邏輯或者對該資料行使用預設值 (使用 CREATE 或 ALTER TABLE的 DEFAULT 關鍵字)。

建議在預存程序中 (例如在建立暫時資料表時) 對任何 CREATE TABLE 或 ALTER TABLE 陳述式中的每一資料行明確指定 NULL 或 NOT NULL。ANSI_DFLT_ON 和 ANSI_DFLT_OFF 選項可控制 SQL Server 指派 NULL 或 NOT NULL 屬性到資料行的方式 (如果在 CREATE TABLE 或 ALTER TABLE 陳述式中沒有指定的話)。如果某一連線以不同於建立預存程序的連線之選項設定值來執行該程序,那麼第二個連線所建立資料表的資料行可能有不同的 Null 屬性而且會顯示出不同的行為。如果對每一資料行都明確陳述了 NULL 或 NOT NULL,那麼暫時資料表對所有執行該預存程序的連線都會以相同的 Null 屬性建立。

當預存程序被建立或修改時,SQL Server 便會儲存 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 兩者的設定值。這些原始設定值會在預存程序被執行時用到。因此,在預存程序執行過程中任何 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 的用戶端工作階段設定值都會被忽略。出現在預存程序內的 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 陳述式不會影響預存程序的功能。

其他 SET 選項 (如 SET ARITHABORT、SET ANSI_WARNINGS 或 SET ANSI_PADDINGS) 不會在預存程序建立或修改時被儲存。如果預存程序的邏輯須依存於某一特定設定值,請將 SET 陳述式包括在該程序開始處以確保正確的設定值。當 SET 陳述式從預存程序被執行時,設定值在預存程序執行完畢前都會保持有效。然後設定值又會回復它在預存程序被呼叫前的值。這樣可以讓個別用戶端設定想要的選項,而不會影響到預存程序的邏輯。



附註 SQL Server 會將空字串解譯為單一空格或解譯為真正的空字串,是由相容性層級設定所控制。如果相容性層級小於或等於 65,則 SQL Server 會將空字串解譯為單一空格。如果相容性層級等於 70,則 SQL Server 會將空字串解譯為空字串。若需相關資訊,請參閱 sp_dbcmptlevel。


取得關於預存程序的資訊
若要顯示用來建立程序的文字,請執行以該程序名稱為參數程序所在資料庫中的 sp_helptext。



附註 以 ENCRYPTION 選項建立的預存程序無法以 sp_helptext 檢視。


如需程序所參照物件的報表,請使用 sp_depends。

若要重新命名程序,請使用 sp_rename。

參照物件
SQL Server 允許建立參照尚未存在之物件的預存程序。在建立時只會進行語法的檢查。如果快取中還沒有有效的計劃,預存程序在執行時會被編譯以產生執行計劃。只有在編譯過程中預存程序所參照的所有物件才會被解析。因此,一個參照不存在之物件但語法正確的預存程序可以被成功地建立,但是因為所參照的物件並不存在所以在執行時會失敗。如需詳細資訊,請參閱延緩名稱解析及編譯。

延緩名稱解析與編譯層級
SQL Server 允許 Transact-SQL 預存程序參照到在建立時尚不存在的資料表。這種能力稱為延緩名稱解析。但是,如果 Transact-SQL 預存程序參照到定義於預存程序內的資料表,且相容性層級設定 (由執行 sp_dbcmptlevel 所設定) 為 65 便會在建立時發出警告。在執行時如果參照的資料表不存在便會傳回錯誤訊息。如需詳細資訊,請參閱 sp_dbcmptlevel 及延緩名稱解析與編譯。

執行預存程序
當 CREATE PROCEDURE 陳述式被成功地執行之後,程序名稱會被儲存在 sysobjects 系統資料表中,而 CREATE PROCEDURE 陳述式的文字則儲存於 syscomments 中。在第一次被執行的時候,這個程序會被編譯以決定擷取資料的最佳存取計劃。

使用 cursor 資料型別的參數
預存程序只能對 OUTPUT 參數使用 cursor 資料型別。如果對參數指定了 cursor 資料型別,則 VARYING 和 OUTPUT 參數兩者都是必需的。如果對參數指定了 VARYING 關鍵字,則資料型別必須為 cursor 而且 OUTPUT 關鍵字也必須被指定。



附註 cursor 資料型別不可透過 OLE DB、ODBC、ADO 及 DB-Library 之類的資料庫 API 繫結至應用程式變數。因為 OUTPUT 參數必須被繫結然後應用程式才能執行預存程序,因此具有 cursor OUTPUT 參數的預存程序不能從資料庫 API 被呼叫。只有當 cursor OUTPUT 變數被指派給 Transact-SQL 的區域 cursor 變數時,這些程序才可以從 Transact-SQL 批次、預存程序或觸發程序中被呼叫。


cursor 輸出參數
以下規則是有關程序被執行時的 cursor 輸出參數:

對於只能向前的資料指標,在資料指標的結果集中傳回的資料列只有那些位於或超過資料指標在被執行預存程序結束時所在位置的資料列,例如:
一個非捲動資料指標在程序中一個名為 RS 的 100 個資料列的結果集被開啟。


程序提取了結果集 RS 的最前面 5 個資料列。


然後程序返回叫用程式。


傳回到叫用程式的結果集 RS 是由 RS 的第 6 到第 100 資料列所構成,而在叫用程式中的資料指標是為於 RS 的第一個資料列之前。
對於只能向前的資料指標,如果資料指標在預存程序完成前被置於第一個資料列之前,那麼整個結果集都會被傳回給叫用的批次、預存程序或觸發程序。在傳回時,資料指標位置是設定在第一個資料列之前。


對於只能向前的資料指標,如果資料指標在預存程序完成前被置於超過最後一個資料列的位置,那麼空的結果集便會傳回給呼叫的批次、預存程序或觸發程序。


附註 空的結果集與 Null 值是不同的。


對於可捲動資料指標,所有結果集中的資料列都會在預存程序執行完畢時被傳回給呼叫的批次、預存程序或觸發程序。 在傳回時,資料指標是留在程序中最後一次提取被執行後的位置。


對於任何類型的資料指標,如果資料指標被關閉了,那麼 Null 值便會傳遞回呼叫的批次、預存程序或觸發程序。當資料指標被指派給某個參數,這種情況也會發生,但該資料指標卻從未被開啟時。


附註 關閉的狀態只會在傳回時有影響。舉例來說,在程序執行到一半時關閉資料指標,稍後在程序中又開啟它,並且傳回該資料指標的結果集給叫用的批次、預存程序或觸發程序,這些都是合法的。


暫時性預存程序
SQL Server 支援兩種暫時性程序:區域與全域。區域暫時性程序只能在建立它的連線中看見。全域暫時性程序則在所有連線中都可使用。區域暫時性程序在目前工作階段結束時會自動被卸除。全域暫時性程序則會在最後一個使用程序的工作階段結束時被卸除。通常,也就是在建立該程序的工作階段結束時。

以 # 和 ## 命名的暫時性程序可以由使用者建立。當程序被建立時,區域程序的擁有者是唯一可以使用它的人。執行區域暫時性程序的權限不能被授予其他使用者。當一個全域暫時性程序被建立後,所有使用者都可以存取它;權限不可被明確地撤銷。明確建立在 tempdb (沒有數字符號的命名) 中的暫時性程序,只能被那些在 tempdb 資料庫具有明確 CREATE PROCEDURE 權限的使用者執行。權限可以從這些程序中授予或撤銷。



附註 大量使用暫時性預存程序會造成對 tempdb 中系統資料表的競爭並嚴重影響效能。因此建議使用 sp_executesql 來取代。sp_executesql 不會將資料儲存在系統資料表中,因此可以避免這種問題。


自動執行預存程序
一個或數個預存程序可以在 SQL Server 啟動時自動執行。這些預存程序必須是由系統管理員所建立,並且當做幕後程序在 sysadmin 固定伺服器角色之下執行。這個 (些) 程序不能有任何輸入參數。

對於您能擁有的啟動程序數量並沒有限制,但請留意每一程序執行時都會佔用掉一條連線。如果您在啟動時必須執行多個程序但是並不需要同時執行它們,那麼您可以讓某一個程序成為啟動程序並且讓它叫用其他的程序。這樣只會使用一條連線。

預存程序的執行會在最後的資料庫於啟動時被復原後開始。若要跳過啟動這些預存程序,請指定追蹤旗標 4022 作為啟動參數。如果您是以最低組態 (使用 -f 旗標) 啟動 SQL Server,啟動預存程序就不會被執行。如需詳細資訊,請參閱追蹤旗標。

若要建立啟動預存程序,您必須以 sysadmin 固定伺服器角色成員身份登入,並將預存程序建立在 master 資料庫中。

使用 sp_procoption 可以:

指定一個現有的預存程序作為啟動程序。


停止某個程序在 SQL Server 啟動時執行。


檢視所有在 SQL Server 啟動時執行的程序的清單。
預存程序巢狀結構化
預存程序可以巢狀結構化;也就是一個預存程序叫用另一個預存程序。當被叫用的程序開始執行時巢狀結構層級就遞增一層,而被叫用程序執行完畢時就減少一層。超過巢狀結構最高層級會導致整個叫用程序鍊失敗。目前的巢狀結構層級會由 @@NESTLEVEL 函數傳回。

若要計算某個編輯過的預存程序之大小,請使用以下效能監視器計數器。

效能監視器物件名稱 效能監視器計算器名稱
SQLServer:Buffer Manager Cache Size (pages)
SQLServer:Cache Manager Cache Hit Ratio
Cache Pages
Cache Object Counts*


* 這些計算器有不同種類的快取物件,包括 adhoc sql、備妥的 sql、程序、觸發程序等。

如需詳細資訊,請參閱 SQL Server:Buffer Manager Object 及 SQL Server:Cache Manager Object。

sql_statement 限制
任何 SET 陳述式都可以在預存程序內指定,除了 SET SHOWPLAN_TEXT 和 SET SHOWPLAN_ALL 以外,這兩者必須是批次中唯一的陳述式。所選擇的 SET 選項在預存程序執行期間都會保持有效,之後就會回復其先前的設定值。

在預存程序之內,如果其他使用者也會用到該預存程序的話,某些陳述式使用的物件名稱必須以物件擁有者名稱來限定。這些陳述式為:

ALTER TABLE


CREATE INDEX


CREATE TABLE


所有 DBCC 陳述式


DROP TABLE


DROP INDEX


TRUNCATE TABLE


UPDATE STATISTICS
權限
CREATE PROCEDURE 權限是預設給 sysadmin 固定伺服器角色以及 db_owner 和 db_ddladmin 固定資料庫角色的成員。sysadmin 固定伺服器角色和 db_owner 固定資料庫角色成員可將 CREATE PROCEDURE 權限轉讓給其他使用者。執行預存程序是授予程序的擁有者,然後他可以將執行權限設定給其他資料庫使用者。

範例
A. 使用有複雜 SELECT 的簡單程序
這個預存程序會從一個四資料表聯結傳回所有作者 (附有姓和名)、他們的職稱,以及他們的出版商。這個預存程序未使用任何參數。

USE pubs
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'au_info_all' AND type = 'P')
DROP PROCEDURE au_info_all
GO
CREATE PROCEDURE au_info_all
AS
SELECT au_lname, au_fname, title, pub_name
FROM authors a INNER JOIN titleauthor ta
ON a.au_id = ta.au_id INNER JOIN titles t
ON t.title_id = ta.title_id INNER JOIN publishers p
ON t.pub_id = p.pub_id
GO

au_info_all 預存程序可以下列方式執行:

EXECUTE au_info_all
-- Or
EXEC au_info_all

或者,如果這個程序是批次中第一個陳述式的話:

au_info_all

B. 使用有參數的簡單程序
這個預存程序會從一個四資料表聯結僅傳回指定的作者 (附有姓和名)、他們的職稱及他們的出版商。這個預存程序會接受所傳遞參數的完全符合項目。

USE pubs
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'au_info' AND type = 'P')
DROP PROCEDURE au_info
GO
USE pubs
GO
CREATE PROCEDURE au_info
@lastname varchar(40),
@firstname varchar(20)
AS
SELECT au_lname, au_fname, title, pub_name
FROM authors a INNER JOIN titleauthor ta
ON a.au_id = ta.au_id INNER JOIN titles t
ON t.title_id = ta.title_id INNER JOIN publishers p
ON t.pub_id = p.pub_id
WHERE au_fname = @firstname
AND au_lname = @lastname
GO

au_info 預存程序可以下列方式執行:

EXECUTE au_info 'Dull', 'Ann'
-- Or
EXECUTE au_info @lastname = 'Dull', @firstname = 'Ann'
-- Or
EXECUTE au_info @firstname = 'Ann', @lastname = 'Dull'
-- Or
EXEC au_info 'Dull', 'Ann'
-- Or
EXEC au_info @lastname = 'Dull', @firstname = 'Ann'
-- Or
EXEC au_info @firstname = 'Ann', @lastname = 'Dull'

或者,如果這個程序是批次中第一個陳述式的話:

au_info 'Dull', 'Ann'
-- Or
au_info @lastname = 'Dull', @firstname = 'Ann'
-- Or
au_info @firstname = 'Ann', @lastname = 'Dull'

C. 使用有萬用字元參數的簡單程序
這個預存程序會從一個四資料表聯結僅傳回指定的作者 (附有姓和名)、他們的職稱及他們的出版商。這個預存程序會以模式比對所傳遞的參數,或者 (如果沒有提供的話) 使用預設值。

USE pubs
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'au_info2' AND type = 'P')
DROP PROCEDURE au_info2
GO
USE pubs
GO
CREATE PROCEDURE au_info2
@lastname varchar(30) = 'D%',
@firstname varchar(18) = '%'
AS
SELECT au_lname, au_fname, title, pub_name
FROM authors a INNER JOIN titleauthor ta
ON a.au_id = ta.au_id INNER JOIN titles t
ON t.title_id = ta.title_id INNER JOIN publishers p
ON t.pub_id = p.pub_id
WHERE au_fname LIKE @firstname
AND au_lname LIKE @lastname
GO

au_info2 預存程序可以許多組合方式來執行。以下所示僅為其中少數幾種組合:

EXECUTE au_info2
-- Or
EXECUTE au_info2 'Wh%'
-- Or
EXECUTE au_info2 @firstname = 'A%'
-- Or
EXECUTE au_info2 '[CK]ars[OE]n'
-- Or
EXECUTE au_info2 'Hunter', 'Sheryl'
-- Or
EXECUTE au_info2 'H%', 'S%'

D. 使用 OUTPUT 參數
OUTPUT 參數可以讓外部程序、批次或一個以上的 Transact-SQL 陳述式在程序執行過程中存取某一值集。在這個範例中,預存程序 titles_sum 會被建立,並且允許一個選擇性的輸入參數和一個輸出參數。

首先建立該程序:

USE pubs
GO
IF EXISTS(SELECT name FROM sysobjects
WHERE name = 'titles_sum' AND type = 'P')
DROP PROCEDURE titles_sum
GO
USE pubs
GO
CREATE PROCEDURE titles_sum @@TITLE varchar(40) = '%', @@SUM money OUTPUT
AS
SELECT 'Title Name' = title
FROM titles
WHERE title LIKE @@TITLE
SELECT @@SUM = SUM(price)
FROM titles
WHERE title LIKE @@TITLE
GO

接下來,在流程控制語言使用 OUTPUT 參數。



附註 在建立資料表過程中以及在使用 OUTPUT 過程中,OUTPUT 變數必須被定義。


參數名稱和變數名稱不一定要一致;但是,資料型別和參數位置則必須相符 (除非使用了 @@SUM = variable)。

DECLARE @@TOTALCOST money
EXECUTE titles_sum 'The%', @@TOTALCOST OUTPUT
IF @@TOTALCOST < 200
BEGIN
PRINT ' '
PRINT 'All of these titles can be purchased for less than $200.'
END
ELSE
SELECT 'The total cost of these titles is $'
+ RTRIM(CAST(@@TOTALCOST AS varchar(20)))

以下為結果集:

Title Name
------------------------------------------------------------------------
The Busy Executive's Database Guide
The Gourmet Microwave
The Psychology of Computer Cooking

(3 row(s) affected)

Warning, null value eliminated from aggregate.

All of these titles can be purchased for less than $200.

E. 使用 OUTPUT 資料指標參數
OUTPUT 資料指標參數是用來將預存程序的區域資料指標傳回叫用的批次、預存程序或觸發程序。

首先,建立在標題資料表宣告並隨後開啟資料指標的程序:

USE pubs
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'titles_cursor' and type = 'P')
DROP PROCEDURE titles_cursor
GO
CREATE PROCEDURE titles_cursor @titles_cursor CURSOR VARYING OUTPUT
AS
SET @titles_cursor = CURSOR
FORWARD_ONLY STATIC FOR
SELECT *
FROM titles

OPEN @titles_cursor
GO

接下來,執行一個宣告區域資料指標變數的批次、執行該程序來指派資料指標給區域變數,然後從資料指標提取兩個資料列。

USE pubs
GO
DECLARE @MyCursor CURSOR
EXEC titles_cursor @titles_cursor = @MyCursor OUTPUT
WHILE (@@FETCH_STATUS = 0)
BEGIN
FETCH NEXT FROM @MyCursor
END
CLOSE @MyCursor
DEALLOCATE @MyCursor
GO

F. 使用 WITH RECOMPILE 選項
當提供給程序的參數並非典型以及當新執行計劃不應被快取或儲存在記憶體中時,WITH RECOMPILE 子句將很有用。

USE pubs
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'titles_by_author' AND type = 'P')
DROP PROCEDURE titles_by_author
GO
CREATE PROCEDURE titles_by_author @@LNAME_PATTERN varchar(30) = '%'
WITH RECOMPILE
AS
SELECT RTRIM(au_fname) + ' ' + RTRIM(au_lname) AS 'Authors full name',
title AS Title
FROM authors a INNER JOIN titleauthor ta
ON a.au_id = ta.au_id INNER JOIN titles t
ON ta.title_id = t.title_id
WHERE au_lname LIKE @@LNAME_PATTERN
GO

G. 使用 WITH ENCRYPTION 選項
WITH ENCRYPTION 子句會隱藏預存程序的文字不讓使用者看見。 本範例將建立加密程序,使用 sp_helptext 系統預存程序取得加密程序的資訊,然後直接從 syscomments 資料表取得該程序的資訊。

IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'encrypt_this' AND type = 'P')
DROP PROCEDURE encrypt_this
GO
USE pubs
GO
CREATE PROCEDURE encrypt_this
WITH ENCRYPTION
AS
SELECT *
FROM authors
GO

EXEC sp_helptext encrypt_this

以下為結果集:

The object's comments have been encrypted.

接下來,選取識別碼和已加密預存程序內容的文字。

SELECT c.id, c.text
FROM syscomments c INNER JOIN sysobjects o
ON c.id = o.id
WHERE o.name = 'encrypt_this'

以下為結果集:



附註 text 資料行輸出顯示於另一行。在執行時,此一資訊會出現在與 id 資料行資訊同一行。


id text
---------- ------------------------------------------------------------
1413580074 ?????????????????????????????????e??????????????????????????????????????????????????????????????????????????

(1 row(s) affected)

H. 建立使用者定義的系統預存程序
這個範例會建立一個程序來顯示資料表名稱開頭有字串 emp 的所有資料表及其對應的索引。如果沒有指定,這個程序會傳回資料表名稱開頭有 sys 的所有資料表 (及索引)。

IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'sp_showindexes' AND type = 'P')
DROP PROCEDURE sp_showindexes
GO
USE master
GO
CREATE PROCEDURE sp_showindexes
@@TABLE varchar(30) = 'sys%'
AS
SELECT o.name AS TABLE_NAME,
i.name AS INDEX_NAME,
indid AS INDEX_ID
FROM sysindexes i INNER JOIN sysobjects o
ON o.id = i.id
WHERE o.name LIKE @@TABLE
GO
USE pubs
EXEC sp_showindexes 'emp%'
GO

以下為結果集:

TABLE_NAME INDEX_NAME INDEX_ID
---------------- ---------------- ----------------
employee employee_ind 1
employee PK_emp_id 2

(2 row(s) affected)

I. 使用延緩名稱解析
這個範例會顯示四個程序及使用延緩名稱解析的不同方式。每一預存程序都會被建立,但是所參照的資料表或資料行在編譯時都不存在。

IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'proc1' AND type = 'P')
DROP PROCEDURE proc1
GO
-- Creating a procedure on a nonexistent table.
USE pubs
GO
CREATE PROCEDURE proc1
AS
SELECT *
FROM does_not_exist
GO
-- Here is the statement to actually see the text of the procedure.
SELECT o.id, c.text
FROM sysobjects o INNER JOIN syscomments c
ON o.id = c.id
WHERE o.type = 'P' AND o.name = 'proc1'
GO
USE master
GO
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'proc2' AND type = 'P')
DROP PROCEDURE proc2
GO
-- Creating a procedure that attempts to retrieve information from a
-- nonexistent column in an existing table.
USE pubs
GO
CREATE PROCEDURE proc2
AS
DECLARE @middle_init char(1)
SET @middle_init = NULL
SELECT au_id, middle_initial = @middle_init
FROM authors
GO
-- Here is the statement to actually see the text of the procedure.
SELECT o.id, c.text
FROM sysobjects o INNER JOIN syscomments c
ON o.id = c.id
WHERE o.type = 'P' and o.name = 'proc2'

_________________
利用>>搜尋<<的功能會比問的還要快得到答案.
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作