sqlrecompile
Sql Server的存儲過程是一個被命名的存儲在伺服器上的Transacation-Sql語句集合,是封裝重復性工作的一種方法,它支持用戶聲明的變數、條件執行和其他強大的編程功能。 存儲過程相對於其他的資料庫訪問方法有以下的優點: (1)重復使用。存儲過程可以重復使用,從而可以減少資料庫開發人員的工作量。 (2)提高性能。存儲過程在創建的時候就進行了編譯,將來使用的時候不用再重新編譯。一般的SQL語句每執行一次就需要編譯一次,所以使用存儲過程提高了效率。 (3)減少網路流量。存儲過程位於伺服器上,調用的時候只需要傳遞存儲過程的名稱以及參數就可以了,因此降低了網路傳輸的數據量。 (4)安全性。參數化的存儲過程可以防止SQL注入式的攻擊,而且可以將Grant、Deny以及Revoke許可權應用於存儲過程。 存儲過程一共分為了三類:用戶定義的存儲過程、擴展存儲過程以及系統存儲過程。 其中,用戶定義的存儲過程又分為Transaction-SQL和CLR兩種類型。 Transaction-SQL 存儲過程是指保存的Transaction-SQL語句集合,可以接受和返回用戶提供的參數。 CLR存儲過程是指對.Net Framework公共語言運行時(CLR)方法的引用,可以接受和返回用戶提供的參數。他們在.Net Framework程序集中是作為類的公共靜態方法實現的。(本文就不作介紹了) 創建存儲過程的語句如下:Code
CREATE { PROC | PROCEDURE } [schema_name.] procere_name [ ; number ]
[ { @parameter [ type_schema_name. ] data_type }
[ VARYING ] [ = default ] [ [ OUT [ PUT ]
] [ ,n ]
[ WITH <procere_option> [ ,n ]
[ FOR REPLICATION ]
AS { <sql_statement> [;][ n ] | <method_specifier> }
[;]
<procere_option> ::=
[ ENCRYPTION ]
[ RECOMPILE ]
[ EXECUTE_AS_Clause ]
<sql_statement> ::=
{ [ BEGIN ] statements [ END ] }
<method_specifier> ::=
EXTERNAL NAME assembly_name.class_name.method_name [schema_name]: 代表的是存儲過程所屬的架構的名稱 例如: Create Schema yangyang8848
Go
Create Proc yangyang8848.AllGoods
As Select * From Master_Goods
Go 執行:Exec AllGoods 發生錯誤。 執行:Exec yangyang8848.AllGoods 正確執行。 [;Number]: 用於對同名過程進行分組的可選整數。使用一個 DROP PROCEDURE 語句可將這些分組過程一起刪除。 例如: Create Proc S1 ;1
AS
Select * From Master_Goods
Go
Create Proc S1 ;2
As
Select * From Master_Location
Go 創建完畢了兩個存儲過程。它們在同一個組S1里,如果執行Exec S1 則存儲過程默認執行 Exec S1 ;1 。如果我們想得到所有據點信息則需要執行Exec S1 ;2。當我們要刪除存儲過程的時候,只能執行Drop Exec S1 則該組內所有的存儲過程被刪除。 [@ parameter]: 存儲過程中的參數,除非將參數定義的時候有默認值或者將參數設置為等於另一個參數,否則用戶必須在調用存儲過程的時候為參數賦值。 存儲過程最多有2100個參數。 例如: Create Proc yangyang8848.OneGoods
@GoodsCode varchar(10)
As
Select * From Master_Goods Where GoodsCode = @GoodsCode
Go 調用的代碼: Declare @Code varchar(10)
Set @Code = '0004'
Exec yangyang8848.OneGoods @Code 在參數的後邊加入Output 表明該參數為輸出參數。 Create Proc yangyang8848.OneGoods
@GoodsCode2 varchar(10) output,@GoodsCode varchar(10) = '0011'
As
Select * From Master_Goods Where GoodsCode = @GoodsCode
Set @GoodsCode2 = '0005'
Go 調用方法:
Declare @VV2 varchar(10)
Exec yangyang8848.OneGoods @Code out 注意:如果存儲過程的兩個參數一個有默認值一個沒有,那麼我們要把有默認值得放在後邊,不然會出問題哦~~ 細心的朋友,可能看到上邊的語句有一些不同,比如,存儲過程用的是output,而調用語句用的是out。我要告訴您,兩者是一樣的。 [RECOMPILE]:指示資料庫引擎 不緩存該過程的計劃,該過程在運行時編譯。如果指定了 FOR REPLICATION,則不能使用此選項。對於 CLR 存儲過程,不能指定 RECOMPILE。 這個說一個非常好用的函數 OBJECT_ID :返回架構范圍內對象的資料庫對象標識號。 例如:我們創建存儲過程時,可以如下寫代碼 If Object_ID('yangyang8848.OneGoods') Is Not Null
Drop Proc yangyang8848.OneGoods
Go Create Proc yangyang8848.OneGoods
@GoodsCode2 varchar(10) out,@GoodsCode varchar(10) = '0011'
As
Select * From Master_Goods Where GoodsCode = @GoodsCode
Set @GoodsCode2 = '0005'
Go 針對於上邊的這個存儲過程,我們調用以下SQL查詢 Select definition From sys.sql_moles
Where object_id = Object_ID('yangyang8848.OneGoods'); 我們是可以查到結果的。 可是如果我們對該存儲過程加入[ ENCRYPTION ] 那麼你將無法看到任何結果 If Object_ID('yangyang8848.OneGoods') Is Not Null
Drop Proc yangyang8848.OneGoods
Go Create Proc yangyang8848.OneGoods
@GoodsCode2 varchar(10) out,@GoodsCode varchar(10) = '0011' With Encryption
As
Select * From Master_Goods Where GoodsCode = @GoodsCode
Set @GoodsCode2 = '0005'
Go</SPAN> 然後我們查詢 sys.sql_moles 目錄視圖,將返回給你Null。</p> 然後我們執行以下SQL: Exec sp_helptext 'yangyang8848.OneGoods' 你將得到以下結果:The text for object 'yangyang8848.OneGoods' is encrypted. 說到這里你應該明白了,參數[ ENCRYPTION ]:是一種加密的功能, 將 CREATE PROCEDURE 語句的原始文本轉換為模糊格式。模糊代碼的輸出在 SQL Server 2005 的任何目錄視圖中都不能直接顯示。對系統表或資料庫文件沒有訪問許可權的用戶不能檢索模糊文本。但是,可通過 DAC 埠訪問系統表的特權用戶或直接訪問資料庫文件的特權用戶可使用此文本。此外,能夠向伺服器進程附加調試器的用戶可在運行時從內存中檢索已解密的過程。 前兩天寫了一篇關於游標的介紹文章 ,下邊寫一個例子,將游標與存儲過程一起使用上: If Object_ID('dbo.GetMasterGoods') Is Not Null
Drop Proc dbo.GetMasterGoods
Go Create Proc GetMasterGoods
@MyCursor Cursor Varying Output
With Encryption
As
Set @MyCursor = Cursor
For
Select GoodsCode,GoodsName From Master_Goods
Open @MyCursor
Go --下邊建立另外一個存儲過程,用於遍歷游標輸出結果 Create Proc GetAllGoodsIDAndName
As Declare @GoodsCode varchar(18)
Declare @GoodsName nvarchar(20)
Declare @MasterGoodsCursor Cursor
Exec GetMasterGoods @MasterGoodsCursor out
Fetch Next From @MasterGoodsCursor
InTo @GoodsCode,@GoodsName
While(@@Fetch_Status = 0)
Begin
Begin
Print @GoodsCode + ':' + @GoodsName
End
Fetch Next From @MasterGoodsCursor
InTo @GoodsCode,@GoodsName
End
Close @MasterGoodsCursor
Deallocate @MasterGoodsCursor
Go 最後執行Exec GetAllGoodsIDAndName結果為以下內容 0003:品0003
0004:品0004
0005:123123
0006:品0006
0007:品0007
0008:品0008
0009:品0009
0010:品0010
0011:品0011
0012:品0012
0013:品0013
0014:品0014
⑵ 在SQL中存儲過程的一般語法是什麼
1、 創建語法
createproc|procerepro_name
[{@參數數據類型}[=默認值][output],
{@參數數據類型}[=默認值][output],
....
]
as
SQL_statements
2、 創建不帶參數存儲過程
--創建存儲過程
if(exists(select*fromsys.objectswherename='proc_get_student'))
dropprocproc_get_student
go
createprocproc_get_student
as
select*fromstudent;
--調用、執行存儲過程
execproc_get_student;
3、 修改存儲過程
--修改存儲過程
alterprocproc_get_student
as
select*fromstudent;
4、 帶參存儲過程
--帶參存儲過程
if(object_id('proc_find_stu','P')isnotnull)
dropprocproc_find_stu
go
createprocproc_find_stu(@startIdint,@endIdint)
as
select*fromstudentwhereidbetween@startIdand@endId
go
execproc_find_stu2,4;
5、 帶通配符參數存儲過程
--帶通配符參數存儲過程
if(object_id('proc_findStudentByName','P')isnotnull)
dropprocproc_findStudentByName
go
createprocproc_findStudentByName(@namevarchar(20)='%j%',@nextNamevarchar(20)='%')
as
select*fromstudentwherenamelike@nameandnamelike@nextName;
go
execproc_findStudentByName;execproc_findStudentByName'%o%','t%';
(2)sqlrecompile擴展閱讀:
SQL存儲過程優點:
1、重復使用。存儲過程可以重復使用,從而可以減少資料庫開發人員的工作量。
2、減少網路流量。存儲過程位於伺服器上,調用的時候只需要傳遞存儲過程的名稱以及參數就可以了,因此降低了網路傳輸的數據量。
3、安全性。參數化的存儲過程可以防止SQL注入式攻擊,而且可以將Grant、Deny以及Revoke許可權應用於存儲過程。
⑶ 怎樣在Sql server中創建,執行和刪除存儲過程
存儲過程是一類編譯好的程序,在創建時進行編譯,之後需要的時候值需要使用使用調用語句調用EXEC。
儲存過程的分類:
1. 系統存儲過程,存放在MASTER資料庫中,以SP_前綴。
2. 用戶自定義存儲過程。
在SQL SERVER中創建儲存過程語法:
Create proc[ere] procere_name[;number]
[{@parameter data_type}
[varying][=default][output]
][,…n]
[with {recompile|encryption|encrypton,recomption}]
[for enplication]
As
Sql_statement[,…n]
參數:
整個語法中只有兩個參數是必須的:procere_name存儲過程名稱和sql_statement存儲過程內容。
procere_name:存儲過程名稱。
;number:對存儲過程分組,「;數字」表示是一組存儲過程,便於批量操作。
@parameter:參數名,命名必須用@開頭;局部變數以@開頭,全局變數以@@開頭。
data_type:參數類型。
varying:指定作為輸出參數的結果集。
Default:參數的默認值。
Output:表示為輸出參數,返回值給execute/exe。
[with {recompile|encryption|encrypton,recomption}][for enplication]:這個我還不明白。。。
As:指定儲存過程要執行的操作。
執行存儲過程語法:
Exec[ute] 存儲過程名 參數
實驗一下,看看效果:
1.創建一組存儲過程並且執行
create procere procere_a;1
as
select * from student
go
create procere procere_a;2
as
select * from student
go
執行創建效果截圖:
圖1創建一組存儲過程
2.執行語句:
Execute procere_a
效果截圖:
圖2執行存儲過程效果截圖
3.刪除語句:
Drop procere procere_a
效果截圖
圖3刪除一組儲存過程效果截圖
創建帶輸入參數的存儲過程:輸入參數是程序將參數值傳遞給存儲過程。
創建一個帶輸入參數的存儲過程,設置默認值,並且對輸入參數的值進行判斷。
Create procere pro_1
@pro_1_a varchar(20)=null
As
If @pro_1_a is null
Print'請輸入需要查詢的所屬院系:'
else
Select avg(成績) from student where 所屬院系=@pro_1_a
分別執行一下:
1.exec pro_1
效果截圖:
圖4執行不帶輸入參數的語句
2.exec pro_1 『計算機』
效果截圖:
圖5執行帶輸入參數的語句
哈哈,verygood,有進步啊。
創建帶輸出參數的存儲過程:輸出參數是存儲過程將返回值傳遞給程序。
1.輸出函數需要指定output作為標識
2.聲明變數需要使用declare
3.給變數指定值需要使用select
來一個例子:如果一個數大於5,則計算他的階乘。
Create procere pro_2
/*聲明輸入輸出參數*/
@in_x int,
@out_y int output
as
/*聲明標量,並且賦值為1*/
Declare @x int,@y int
Select @x=1,@y=1
/*if語句判斷輸入值是否合法,使用while循環語句計算*/
If @in_x<=5
Print'請輸入大於5的數:'
Else
While @x<=@in_x
Begin
Select @y=@y*@x
Select @x=@x+1
End
Select @out_y=@y
1.執行以上創建代碼
圖6創建帶輸入輸出參數的存儲過程截圖
2.提供參數執行代碼
Declare @out_sum int
Exec pro_2 6,@out_sum output
Select @out_sum as result
圖7提供輸入輸出參數執行存儲過程截圖
創建多條語句的存儲過程:一個存儲過程中可以寫入多條SQL語句,這些語句將被依次執行,可以實現多個功能。
刪除存儲過程delete及判斷對象是否存在exists:
Delete procere procere_name
If exists(select子查詢):如果exists的參數查詢為非空,則exists結果為true,否則為假。
存儲過程作為一個對象將被保存在資料庫的sysobjects表中,可以使用語句判斷這個對象是否存在:select * from sysobjects where name=』procere_name』
幾個系統存儲過程的使用:
Sp_name:重命名對象-- Sp_name object1,object2
Sp_depends:顯示引用對象—sp_depends students
Sp_help:顯示對象信息
Sp_helptext:顯示對象的源代碼
⑷ 數據導入Oracle後,再在PL/SQL中手工編譯一下,用什麼語句
recompile object_name;
還可以批量編譯者棗:
菜單tools -> compile invalid objects -> 按禪伏F8就首襲拆可以了
⑸ 請問在SQLserver 中如何指定一個資料庫類型的變數就是說裡面引用的表前的資料庫前綴可以像變數一樣改變
如果僅僅是 為了 指向一個 外部資料庫, 使用 資料庫 同義詞, 來作這個事情就好了.
下面的例子,就是 Test2 資料庫, 要訪問 Test 資料庫的一個表
默認的情況下,要 全名 Test.dbo.v_sale_report_sum
建立 同義詞, 可以簡化處理。
如果一定要按照樓主的那種處理方式, 那就只有用 動態SQL 來處理了。
1>
2> USE [Test2]
3> GO
已將資料庫上下文更改為猛高滾 'Test2'。
1> SELECT * FROM Test.dbo.v_sale_report_sum;
2> go
sale_item sale_money
--------- ----------------------------------------
A 733285.00
C 5738.00
B 2382.00
(3 行受影響)
1> SELECT * FROM v_sale_report_sum;
2>枝余 go
消息 208,級別 16,狀態 1,伺服器 HOME-BED592453C\SQLEXPRESS,第 1 行
對象名 'v_sale_report_sum'念大 無效。
1> CREATE SYNONYM v_sale_report_sum
2> FOR Test.dbo.v_sale_report_sum;
3> go
1> SELECT * FROM v_sale_report_sum;
2> go
sale_item sale_money
--------- ----------------------------------------
A 733285.00
C 5738.00
B 2382.00
(3 行受影響)
⑹ SQLSERVER 什麼時候重新編譯執行計劃
根據資料庫新狀態的不同,資料庫中的某些更改可能導致執行計劃效率降低或無效。SQL Server 將檢測到使執行計劃無效的更改,並將計劃標記為無效。此後,必須為執行查詢的下一個連接重新編譯新的計劃。導致計劃無效的情況包括:
對查詢所引用的表或視圖進行更改(ALTER TABLE 和 ALTER VIEW)。
對執行計劃所使用的任何索引進行更改。
對執行計劃所使用的統計信息進行更新,這些更新可能是從語句(如 UPDATE STATISTICS)中顯式生成,也可能是自動生成的。
刪除執行計劃所使用的索引。
顯式調用 sp_recompile。
對鍵的大量更改(其他用戶對由查詢引用的表使用 INSERT 或 DELETE 語句所產生的修改)。
對於帶觸發器的表,插入的或刪除的表內的行數顯著增長。
使用 WITH RECOMPILE 選項執行存儲過程。
為了使語句正確,或要獲得可能更快的查詢執行計劃,大多數都需要進行重新編譯。
在 SQL Server 2000 中,只要批處理中的語句導致重新編譯,就會重新編譯整個批處理,無論此批處理是通過存儲過程、觸發器、即席批查詢,還是通過預定義的語句進行提交。在 SQL Server 2005 和更高版本中,只會重新編譯批處理中導致重新編譯的語句。由於這種差異,SQL Server 2000 和更高版本中的重新編譯計數不可比較。另外,由於 SQL Server 2005 和更高版本擴展了功能集,因此它們具有更多類型的重新編譯。
語句級重新編譯有助於提高性能,因為在大多數情況下,只有少數語句導致了重新編譯並造成相關損失(指 CPU 時間和鎖)。因此,避免了批處理中其他不必重新編譯的語句的這些損失。
SQL Server ProfilerSP:Recompile 跟蹤事件報告語句級重新編譯。此跟蹤事件在 SQL Server 2000 中僅報告批處理重新編譯。此外,將填充此事件的 TextData 列。因此,已不再需要 SQL Server 2000 中必須跟蹤 SP:StmtStarting 或 SP:StmtCompleted 以獲取導致重新編譯的 Transact-SQL 文本的做法。
跟蹤事件 SQL:StmtRecompile 報告語句級重新編譯。此跟蹤事件可用於跟蹤和調試重新編譯。SP:Recompile 僅針對存儲過程和觸發器生成,而SQL:StmtRecompile 則針對存儲過程、觸發器、即席批查詢、使用 sp_executesql 執行的批處理、已准備的查詢和動態 SQL 生成。
SP:Recompile 和 SQL:StmtRecompile 的 EventSubClass 列都包含一個整數代碼,用以指明重新編譯的原因。
⑺ 修改欄位長度plsql
通過PL/SQL Developer登入到資料庫的管理界面,當然,也可以使用別的資料庫管理工具。
⑻ 使用SQL語句創建存儲過程
使用SQL語句創建存儲的具體過程如下:
1、首先,打開企業管理器,選擇【工具】-【查詢分析器】:
⑼ 什麼叫重編譯
例如:SQLSERVER編譯與重編譯這種行為叫「重用(reuse)或者叫重用執行計劃」。但是有時候,哪怕是一模一樣的語句,SQL下次執行還是要再做一次編譯。 這種行為叫「重編譯(recompile)」。
⑽ 用SQL語句創建存儲過程
--1、創建存儲過程--
if
exists
(select
*
from
sysobjects
where
name='info1')
drop
procere
info1
go
create
procere
info1
@sname
varcher(20),
as
begin
declear
@xinxi
varcher(20)
set
@xinxi='select
學號,姓名,出身日期,系別(注,列名自己設置)
from
student
where
姓名=@sname'
print'@xinxi';
end
--調用存儲過程1--
exec
info1
@sname=姓名
後面的自己參考,可以寫出來