當前位置:首頁 » 存儲配置 » sql存儲過程錯誤信息

sql存儲過程錯誤信息

發布時間: 2022-06-29 11:00:32

sql存儲過程錯誤

execERP_IM_GRRefPUOrder_ReferOrderItem@DestBillID=N'',@Condition=N'POItems.POItemTypeCode=''N''andPurchaseOrders.CreateDatebetween''20180529''and''20180706''andPOItems.CompanyID=''01101''andPurchaseOrders.PurOrgID=''2402922e-6843-417c-9''andPurchaseOrders.PurGroupID=''00000000000000000001''andPurchaseOrders.VendorCode=''00001''',@OtherCondition=N'01101';

㈡ sql存儲過程語法錯誤怎麼辦

insert book (編號,書名,價格) Values (@param1,@param2,@param3)
價格後面的)是中文輸入狀態的括弧,應該用英文輸入狀態的括弧)

㈢ 如何在SQL存儲過程中處理錯誤

一、存儲過程中使用事務的簡單語法

在存儲過程中使用事務時非常重要的,使用數據可以保持數據的關聯完整性,在Sql server存儲過程中使用事務也很簡單,用一個例子來說明它的語法格式:

CreateProcereMyProcere
(@Param1nvarchar(10),
@param2nvarchar(10)
)
AS
Begin
SetNOCOUNTON;
SetXACT_ABORTON;
BeginTran
Deletefromtable1wherename=』abc』;
Insertintotable2values(value1,value2,value3);
CommitTran
End

說明:

1 、使用存儲過程執行事物,需要開啟XACT_ABORT參數(默認值為Off),將該參數設置為On,表示當執行事務時,如果出錯,會將transcation設置為uncommittable狀態,那麼在語句塊批處理結束後將回滾所有操作;如果該參數設置為Off,表示當執行事務時,如果出錯,出錯的語句將不會執行,其他正確的操作繼續執行。


2、當SET NOCOUNT 為 ON 時,不返回計數(計數表示受 Transact-SQL 語句影響的行數,例如在Sql server查詢分析器中執行一個delete操作後,下方窗口會提示(3)Rows Affected)。當 SET NOCOUNT 為 OFF 時,返回計數,我們應該在存儲過程的頭部加上SET NOCOUNT ON 這樣的話,在退出存儲過程的時候加上 SET NOCOUNT OFF這樣的話,以達到優化存儲過程的目的。

二、事務內設置保存點

用戶可以在事務內設置保存點或標記。保存點定義如果有條件地取消事務的一部分,事務可以返回的位置。如果將事務回滾到保存點,則必須(如果需要,使用更多的 Transact-SQL 語句和 COMMIT TRANSACTION 語句)繼續完成事務,或者必須(通過將事務回滾到其起始點)完全取消事務。若要取消整個事務,請使用 ROLLBACK TRANSACTION transaction_name 格式。這將撤消事務的所有語句和過程。如:

代碼

CreateProcereMyProcere
AS
Begin
SetNOCOUNTON;
SetXACT_ABORTON;
begintranok--開始一個事務OK
deletefromrxqzwhereqz='rx015'--刪除數據
savetranbcd--保存一個事務點命名為bcd
updateszsetname='李麗s'wherename='李麗'--修改數據

if@@error<>0--判斷修改數據有沒有出錯
begin--如果出錯
rollbacktranbcd--回滾事務到BCD的還原點
committranok--提交事務
end
else--沒有出錯
committranok--提交事務
End

說明:1、@@error判斷是否有錯誤,為0表示沒有錯誤,但是對那種重大錯誤無法捕捉,而且@@error只能前一句sql語句生效。

三、存儲過程使用try…catch捕獲錯誤

在存儲過程中可以使用try…catch語句來捕獲錯誤,如下:

CreateProcereMyProcere
(@Param1nvarchar(10),
@param2nvarchar(10)
)
AS
Begin
SetNOCOUNTON;
Begintry
Deletefromtable1wherename=』abc』;
Insertintotable2values(value1,value2,value3);
Endtry
BeginCatch
SELECTERROR_NUMBER()ASErrorNumber,
ERROR_MESSAGE()ASErrorMessage;
EndCatch
End

說明:1、捕獲錯誤的函數有很多,如下:

ERROR_NUMBER() 返回錯誤號。

ERROR_SEVERITY() 返回嚴重性。

ERROR_STATE() 返回錯誤狀態號。

ERROR_PROCEDURE() 返回出現錯誤的存儲過程或觸發器的名稱。

ERROR_LINE() 返回導致錯誤的常式中的行號。

ERROR_MESSAGE() 返回錯誤消息的完整文本。該文本可包括任何可替換參數所提供的值,如長度、對象名或時間。

2、有些錯誤,如sql語句中的表名稱輸入錯誤,這是資料庫引擎無法解析這個表名稱時,所發生的錯誤在當前的try…catch語句中無法捕獲,必須由外層調用該存儲過程的地方使用 try…catch來進行捕獲。

四、存儲過程中事務和try…catch聯合使用

在存儲過程中使用事務時,如果沒有try…catch語句,那麼當set xact_abort on時,如果有錯誤發生,在批處理語句結束後,系統會自動回滾所有的sql操作。當set xact_abort off時,如果有錯誤發生,在批處理語句結束後,系統會執行所有沒有發生錯誤的語句,發生錯誤的語句將不會被執行。

在存儲過程中使用事務時,如果存在try…catch語句塊,那麼當捕獲到錯誤時,需要在catch語句塊中手動進行Rollback操作,否則系統會給客戶端傳遞一條錯誤信息。如果在存儲過程開始處將set xact_abort on,那麼當有錯誤發生時,系統會將當前事務置為不可提交狀態,即會將xact_state()置為-1,此時只可以對事務進行Rollback操作,不可進行提交(commit)操作,那麼我們在catch語句塊中就可以根據xact_state()的值來判斷是否有事務處於不可提交狀態,如果有則可以進行rollback操作了。如果在存儲過程開始處將set xact_abort off,那麼當有錯誤發生時,系統不會講xact_state()置為-1,那麼我們在catch塊中就不可以根據該函數值來判斷是否需要進行rollback了,但是我們可以根據@@Trancount全局變數來判斷,如果在catch塊中判斷出@@Trancount數值大於0,代表還有未提交的事務,既然進入catch語句塊了,那麼還存在未提交的事務,該事務應該是需要rollback的,但是這種方法在某些情況下可能判斷的不準確。推薦的方法還是將set xact_abort on,然後在catch中判斷xact_state()的值來判斷是否需要Rollback操作。

下面我們來看看兩個例子:

一.使用Set xact_abort on

CreateprocmyProcere
As
begin
setxact_aborton;
begintry
begintran
insertintoTestStuvalues('Terry','boy',23);
insertintoTestStuvalues('Mary','girl',21);
committran
endtry
begincatch
--在此可以使用xact_state()來判斷是否有不可提交的事務,不可提交的事務
--表示在事務內部發生錯誤了。Xact_state()有三種值:-1.事務不可提交;
--1.事務可提交;0.表示沒有事務,此時commit或者rollback會報錯。
ifxact_state()=-1
rollbacktran;
endcatch
end

二.使用Set xact_abort off

CreateprocmyProcere
As
begin
setxact_abortoff;
begintry
begintran
insertintoTestStuvalues('Terry','boy',23);
insertintoTestStuvalues('Mary','girl',21);
committran
endtry
begincatch
--在此不可以使用xact_state來判斷是否有不可提交的事務
--只可以使用@@Trancount來判斷是否有還未提交的事務,未提交的事務未必
--就是不可提交的事務,所以使用@@TranCount>0後就RollBack是不準確的
if@@TranCount>0
rollbacktran;
endcatch
end


另外,對於@@Trancount需要說明的是,begin tran 語句將 @@Trancount加 1。Rollback tran將 @@Trancount遞減到 0,但 Rollback tran savepoint_name 除外,它不影響 @@Trancount。Commit tran 或 Commit work 將 @@Trancount 遞減 1。

㈣ sql存儲過程報錯,缺少對象或列名,或者對象或列名為空。

@row2column的值如果為空,就是沒有列了,語法會出錯。

如果是@row2column的列里的數據有為空的,應該是沒有問題的吧。

㈤ SQL Server資料庫新建存儲過程時出現錯誤。

create
procere
spGetEmployees
AS
select
員工姓名
from
員工
order
by
員工姓名
上面這段語句報
報錯是消息102,級別15,狀態1,第1行,『』附近有語法錯誤
『』我都沒看到,怎麼會報這個錯誤?

㈥ sql server 創建存儲過程為什麼提示錯誤

有' '這個不是空而是特殊字元

㈦ sql存儲過程錯誤處理

ifexists(select*fromsysobjectswherextype='U'AndName='table1')
begin
select*fromtable1
select*fromtable2
end
else
begin
select*fromtable2
end

㈧ plsql調用存儲過程報錯,怎麼調試

1. 打開PL/SQL Developer如果 在機器上安裝了PL/SQL Developer的話,打開PL/SQL Developer界面輸入 用戶名,密碼和host名字,這個跟在程序中web.config中配置的完全相同,點擊確定 找到 需要調試的存儲過程所在的包(Package bodies),如PACK_ACTIVITY,點擊右鍵,在彈出菜單中選擇[查看],得到包中的所有存儲過程和他們的代碼.
2. 添加debug信息為了 能夠單步跟蹤存儲過程,需要為其所在的包添加debug信息,右鍵點擊需要調試的包,在彈出菜單中選中[添加調試信息](這個很重要).這樣 就為包體添加了調試信息。
3. 調 試存儲過程現在 所有的准備工作都做好了,可以調試跟蹤存儲過程了。選擇 需要調試的存儲過程,點擊右鍵,在彈出菜單中 選擇[測試],進去測試窗口.測試窗口中有為了測試該存儲過程自動所產生的代碼,當然你也可以自己另外加入和修改代碼,對於我們目前只是為了調試存儲過程, 自動生成的代碼已經足夠了。接著按照如下的步驟進行調試。
(1)添加存儲過程所需要的參數,我們項目中的大多數存儲過程都是需要參數 的,參數可以在測試窗口右下部分輸入。如:GetPanNO_New需要一個輸入參數v_employeeid,我們輸入180,輸出參數是mycursor,是查看結果的,不需要輸入任何值。
(2)開始調試,點擊[調試]菜單->[開始](或者按F9),就進去調試模式了,程序開始停在begin這一行.
(3)以後的調試過程跟我們熟悉的的調試過程就一樣了:運行(Ctrl+R)單步 進入(Ctrl+N)單步 跳過(Ctrl+O)單步 退出(Ctrl+T)或者 點擊debug工具條上的按扭:當按Ctrl+N進去存儲過程的源代碼中後 在這 個窗口中可以查看過程中的變數值和堆棧。
(4)調試運行完了後,可以查看結果如下(點擊mycursor變數旁邊的按鈕).
4. Tip 令人 比較郁悶的是我們項目中很多的存儲過程都是一個SELECT語句,不管這個SELECT語句多麼復雜(SELECT語句中有嵌套的子SELECT語句),它也只能作為一行代碼,單步跟蹤就沒有什麼意義了。

㈨ SQL存儲過程中提示「'+' 附近有語法錯誤。應為','或';'」。請問這段代碼錯在何處

sql 語句是可以跨行的。
但是你那裡, 是一個字元串的參數, 需要 寫在一行裡面, 不要跨行啊.

從 E:\Test.xls 文件中,檢索 Sheet1 中的數據。
SELECT *
FROM OpenDataSource(
'Microsoft.Jet.OLEDB.4.0',
'Data Source="E:\Test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...[Sheet1$]

如果寫在一行裡面, 還是抱錯的話。
那麼建議是 定義一個變數來存儲這個 參數了。
然後調用的時候, 只傳遞個參數變數即可。

㈩ sql 存儲過程錯誤

alter procere orderasp
@grade int,--Session("OKAdminGrade")
@th int--第幾頁的分組
as
declare @groupnum int--一頁的組的數量
set @groupnum=20
set @th=(@th-1)*@groupnum
if @grade=3
exec ('select top '+cast(@groupnum as varchar(10))+' sub_id from qep_sub where sub_id not in
(select top '+cast(@th as varchar(10))+' sub_id from qep_sub where sub_zt>0 order by sub_date desc)
and sub_zt>0 order by sub_date desc')
else
exec('select top '+cast(@groupnum as varchar(10))+' sub_id from qep_sub where sub_id not in
(select top '+cast(@th as varchar(10))+' sub_id from qep_sub where sub_zt>0 and sub_kf=''3'' order by sub_date desc)
and sub_zt>0 and sub_kf=''3'' order by sub_date desc')

你這個需要用到動態的sql語句來解決

以上,希望對你有所幫助!

熱點內容
我的世界美服伺服器 發布:2024-04-24 12:39:36 瀏覽:15
linuxc文件函數 發布:2024-04-24 12:39:32 瀏覽:819
編譯過程測試視頻 發布:2024-04-24 12:39:31 瀏覽:21
百度語音python3 發布:2024-04-24 12:29:21 瀏覽:607
天翼電視伺服器地址是啥 發布:2024-04-24 12:21:47 瀏覽:278
pythonstackless 發布:2024-04-24 11:20:18 瀏覽:123
高壓縮比發動機 發布:2024-04-24 11:13:16 瀏覽:345
數獨c語言 發布:2024-04-24 11:05:10 瀏覽:916
sql2008外網訪問 發布:2024-04-24 10:34:20 瀏覽:576
如何在伺服器中添加字 發布:2024-04-24 10:21:43 瀏覽:362