當前位置:首頁 » 編程語言 » sqlstoreprocedure
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sqlstoreprocedure

發布時間: 2022-02-10 12:41:44

⑴ 如何接收 Store Procere 的傳回值

3 種方式:
使用 SELECT 以表格方式傳回。
設定 Output Parameter 以參數方式傳回。
使用 RETURN 傳回 1 個整數型別的資料。
以下列出這 3 種傳回方式,在 sql 及 ADO.NET 中接收的方法。

一、使用 SELECT 以表格方式傳回
我們先來看第 1 種,這也是我最常用的方式。
Store Procere:
01 IF OBJECT_ID('mysp_QueryData') IS NOT NULL
02 DROP PROCEDURE mysp_QueryData
03 GO
04 CREATE PROCEDURE mysp_QueryData (
05 @id int
06 )
07 AS
08 BEGIN
09 SELECT LastName, FirstName
10 FROM Customer
11 WHERE CustomerID = @id;
12 END

在另一支預儲程序中要接收此預儲程序傳回的資料,方法如下:
1 IF OBJECT_ID('tempdb..#tmp') IS NOT NULL
2 DROP TABLE #tmp
3 GO
4 CREATE TABLE #tmp (lname varchar(30), fname varchar(10));
5 INSERT INTO #tmp EXEC mysp_QueryData '1';
6 SELECT * FROM #tmp;
1~2 行:判斷若暫存資料表已存在則進行刪除。
4~6 行:先建立暫存資料表,再使用 INSERT INTO 方式寫入後即可對暫存資料表操作取值。

C#
01 SqlConnection conn = new SqlConnection(strConn);
02 SqlCommand cmd = new SqlCommand(string.Empty, conn);
03 conn.Open();
04
05 cmd.Parameters.Clear();
06 cmd.CommandType = CommandType.StoredProcere;
07 cmd.CommandText = "mysp_QueryData";
08 cmd.Parameters.Add("@id", SqlDbType.Int).Value = 1;
09
10 SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow);
11
12 if (reader.HasRows)
13 {
14 reader.Read();
15 Console.WriteLine("Last Name:" + reader["LastName"]);
16 Console.WriteLine("First Name:" + reader["FirstName"]);
17 }
18
19 reader.Close();
20 reader.Dispose();
21
22 conn.Close();
23 conn.Dispose();
此例是以 ExecuteReader() 來進行讀取,然後配合 SqlDataReader 物件將欄位值讀出。
因傳回的內容只有 1 個資料集,所以第 10 行在讀取時可以使用 CommandBehavior.SingleRow 來接收傳回的資料集,可結省資源及增進效率,但要注意,若是傳回的內容有 2 個資料集以上,那麼使用 CommandBehavior.SingleRow 就無法讀到第 2 個以後的資料集內容了。
假設傳回內容只有 1 個傳回值,或是只要讀取傳回的第 1 筆資料的第 1 個欄位值,可以使用 ExecuteScalar() 將 LastName 讀出,如此上面 10~20 行的程式可改為如下:
1 string strName = Convert.ToString(cmd.ExecuteScalar());
2 Console.WriteLine("Last Name:" + strName);

二、設定 Output Parameter 以參數方式傳回
Store Procere:
01 CREATE PROCEDURE mysp_QueryData (
02 @id int,
03 @LastName Varchar(30) output
04 )
05 AS
06 BEGIN
07 SELECT @LastName = LastName
08 FROM Customer
09 WHERE CustomerID = @id;
10 END
關鍵在第 3 行,在參數後方加上 output 設定為輸出參數。

在另一支預儲程序中要接收此預儲程序傳回的輸出參數方法如下:
1 DECLARE @lname varchar(30);
2 EXEC mysp_QueryData '1',@lname output;
3 PRINT @lname;
第 2 行:在執行預儲程序後方指定參數時,要接收輸出的參數設定 output 即可。

C#
01 SqlConnection conn = new SqlConnection(strConn);
02 SqlCommand cmd = new SqlCommand(string.Empty, conn);
03 conn.Open();
04
05 cmd.Parameters.Clear();
06 cmd.CommandType = CommandType.StoredProcere;
07 cmd.CommandText = "mysp_QueryData";
08 cmd.Parameters.Add("@id", SqlDbType.Int).Value = 1;
09
10 SqlParameter lastName = cmd.Parameters.Add("@LastName", SqlDbType.VarChar, 30);
11 lastName.Direction = ParameterDirection.Output;
12
13 cmd.ExecuteNonQuery();
14
15 Console.WriteLine("Last Name:" + lastName.Value);
16
17 conn.Close();
18 conn.Dispose();
第 10 行:建立要接收輸出的參數名稱資料,參數名稱 @LastName 須與預儲程序中的參數名稱一樣。
第 11 行:設定為輸出參數。
第 15 行:用 .value 將傳回資料取出。

三、使用 RETURN 傳回單一數值
Store Procere:
1 CREATE PROCEDURE mysp_InsData (
2 @LastName varchar(30),
3 @FirstName varchar(10)
4 )
5 AS
6 BEGIN
7 INSERT INTO Customer (LastName, FirstName) VALUES (@LastName, @FirstName);
8 RETURN SCOPE_IDENTITY();
9 END
在新增完資料後,使用 RETURN 返回新增資料的識別值。

在另一支預儲程序中接收此預儲程序傳回的值:
1 DECLARE @intRow int;
2 EXEC @intRow = mysp_InsData 'Walter', 'Liao';
3 SELECT @intRow;

C#
01 SqlConnection conn = new SqlConnection(strConn);
02 SqlCommand cmd = new SqlCommand(string.Empty, conn);
03 conn.Open();
04
05 cmd.Parameters.Clear();
06 cmd.CommandType = CommandType.StoredProcere;
07 cmd.CommandText = "mysp_InsData";
08 cmd.Parameters.Add("@LastName", SqlDbType.VarChar, 30).Value = "Walter";
09 cmd.Parameters.Add("@FirstName", SqlDbType.VarChar, 10).Value = "Liao";
10
11 SqlParameter retID = cmd.Parameters.Add("@ReturnValue", SqlDbType.Int);
12 retID.Direction = ParameterDirection.ReturnValue;
13
14 try
15 {
16 cmd.ExecuteNonQuery();
17 }
18 catch (Exception ex)
19 {
20 //當新增資料時若發生錯誤,可撰寫程式將錯誤訊息記錄下來
21 //InsErrorLog("mysp_InsData", ex.Message);
22 }
23
24 Console.WriteLine("Return Value:" + retID.Value);
25
26 conn.Close();
27 conn.Dispose();
第 11 行:建立要接收 RETURN 的參數,參數名稱 @ReturnValue 可自定。
第 12 行:將參數設定為 Return Value。
第 24 行:用 .value 將傳回資料取出。

⑵ SQL資料庫中刪除數據提示錯誤「Could not find stored procere」

實現級聯刪除的sqlserver自帶存儲過程被破壞了,重新安裝sqlserver吧

⑶ 何謂store procere該如何使用

正確寫的話應該是stored procere
中文翻成預儲程序

簡單的講,就是資料庫的副程式

不過大部分的情況是...
遇到一件要處理資料的問題時

DBA喜歡寫stored procere
Programmer喜歡在程式處理 XD

很難界定哪種是好或不好

下面有簡單的教學

http://msdn.microsoft.com/zh-tw/library/ms187926(SQL.90).aspx

⑷ 關於SQL 更新stored procere存儲過程

ALTER PROCEDURE proc_name
@Value Varchar(10)
AS
DECLARE @TempValue AS Varchar(10)
DECLARE @TempTable AS Table (Number Varchar(20))
BEGIN
SET @TempValue = @Value + CAST((YEAR(GETDATE( ))+1) AS Char(4))
INSERT INTO @TempTable (Number) VALUES (@TempValue)
SELECT * FROM @TempTable
END

-- 原來的存儲過程是取當前年份來做處理的,所以year(getdate())+1就是2012了

⑸ sqlserver怎樣備份store procere

使用xp_cmdshell方法之前必須先開啟對應的伺服器配置選項,查詢系統中每個伺服器范圍的配置選項值使用以下語句。

⑹ 如何打開sql2008加密的store proceres

Create PROCEDURE [dbo].[sp_windbidecrypt]
(@procere sysname = NULL, @revfl int = 1)
AS
/***********************************************************
原作者:王成輝翻譯整理
連接sqlcmd語法:
sqlcmd -A -d databasename -o c:\a.txt
調用形式為:
先運行cmd
執行 :
sqlcmd -A -d gzzywst -o c:\a.txt
注意: -A A一定要大寫,-d 後面是要進入的資料庫 -o 是文件輸出路徑及文件名。本方法為連接本機SQL2008 遠程登錄的時候語法更復雜一些,需要伺服器IP 登錄用戶 及密碼
第二步:
輸入
exec sp_windbidecrypt 'Ts_b_InsertBillDetailDraft',0
再輸入
go
以後回車執行接觸會跳行,跳行無錯誤顯示,存儲過程即解密成功,可以在輸出路徑下查看了。

或者在sql manament studio中新建--資料庫引擎查詢:admin:192.168.1.0然後執行語句就可以了
---------------------------------------------------------------
如果第二個參數使用1的話,會給出該存儲過程的一些提示。
--版本4.0 修正存儲過程過長解密出來是空白的問題
這個版本已經完全可以解密出sql2008下面的存儲過程了
**************************************************************/
SET NOCOUNT ON
IF @revfl = 1
BEGIN
PRINT '警告:該存儲過程會刪除並重建原始的存儲過程。'
PRINT ' 在運行該存儲過程之前確保你的資料庫有一個備份。'
PRINT ' 該存儲過程通常應該運行在產品環境的一個備份的非產品環境下。'
PRINT ' 為了運行這個存儲過程,將參數@refl的值更改為0。'
RETURN 0
END
DECLARE @intProcSpace bigint, @t bigint, @maxColID smallint,@procNameLength int
select @maxColID = max(subobjid) FROM
sys.sysobjvalues WHERE objid = object_id(@procere)
--select @maxColID as 'Rows in sys.sysobjvalues'
select @procNameLength = datalength(@procere) + 29
DECLARE @real_01 nvarchar(max)
DECLARE @fake_01 nvarchar(max)
DECLARE @fake_encrypt_01 nvarchar(max)
DECLARE @real_decrypt_01 nvarchar(max),@real_decrypt_01a nvarchar(max)
declare @objtype varchar(2),@ParentName nvarchar(max)
select @real_decrypt_01a = ''
--提取對象的類型如是存儲過程還是函數,如果是觸發器,還要得到其父對象的名稱
select @objtype=type,@parentname=object_name(parent_object_id)
from sys.objects where [object_id]=object_id(@procere)
-- 從sys.sysobjvalues里提出加密的imageval記錄
SET @real_01=(SELECT top 1 imageval FROM sys.sysobjvalues WHERE objid =
object_id(@procere) and valclass = 1 order by subobjid)

--創建一個臨時表
create table #output ( [ident] [int] IDENTITY (1, 1) NOT NULL ,
[real_decrypt] NVARCHAR(MAX) )
--開始一個事務,稍後回滾
BEGIN TRAN
--更改原始的存儲過程,用短橫線替換
if @objtype='P'
SET @fake_01='ALTER PROCEDURE '+ @procere +' WITH ENCRYPTION AS select 1
/**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/'
else if @objtype='FN'
SET @fake_01='ALTER FUNCTION '+ @procere +'() RETURNS INT WITH ENCRYPTION AS BEGIN RETURN 1
/**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/ END'
else if @objtype='V'
SET @fake_01='ALTER view '+ @procere +' WITH ENCRYPTION AS select 1 as col
/**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/'
else if @objtype='TR'
SET @fake_01='ALTER trigger '+ @procere +' ON '+@parentname+'WITH ENCRYPTION AFTER INSERT AS RAISERROR (''N'',16,10)
/**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/'
EXECUTE (@fake_01)
--從sys.sysobjvalues里提出加密的假的
SET @fake_encrypt_01=(SELECT top 1 imageval FROM sys.sysobjvalues WHERE objid =
object_id(@procere) and valclass = 1 order by subobjid )
if @objtype='P'
SET @fake_01='Create PROCEDURE '+ @procere +' WITH ENCRYPTION AS select 1
/**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/'
else if @objtype='FN'
SET @fake_01='CREATE FUNCTION '+ @procere +'() RETURNS INT WITH ENCRYPTION AS BEGIN RETURN 1
/**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/ END'
else if @objtype='V'
SET @fake_01='Create view '+ @procere +' WITH ENCRYPTION AS select 1 as col
/**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/'
else if @objtype='TR'
SET @fake_01='Create trigger '+ @procere +' ON '+@parentname+'WITH ENCRYPTION AFTER INSERT AS RAISERROR (''N'',16,10)
/**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/'
--開始計數
SET @intProcSpace=1
--使用字元填充臨時變數
SET @real_decrypt_01 = replicate(cast('A'as nvarchar(max)), (datalength(@real_01) /2 ))
--循環設置每一個變數,創建真正的變數
--每次一個位元組
SET @intProcSpace=1
--如有必要,遍歷每個@real_xx變數並解密
WHILE @intProcSpace<=(datalength(@real_01)/2)
BEGIN
--真的和假的和加密的假的進行異或處理
SET @real_decrypt_01 = stuff(@real_decrypt_01, @intProcSpace, 1,
NCHAR(UNICODE(substring(@real_01, @intProcSpace, 1)) ^
(UNICODE(substring(@fake_01, @intProcSpace, 1)) ^
UNICODE(substring(@fake_encrypt_01, @intProcSpace, 1)))))
SET @intProcSpace=@intProcSpace+1
END

--通過sp_helptext邏輯向表#output里插入變數
insert #output (real_decrypt) select @real_decrypt_01
--select real_decrypt AS '#output chek' from #output --測試
-- -------------------------------------
--開始從sp_helptext提取
-- -------------------------------------
declare @dbname sysname
,@BlankSpaceAdded int
,@BasePos int
,@CurrentPos int
,@TextLength int
,@LineId int
,@AddOnLen int
,@LFCR int --回車換行的長度
,@DefinedLength int
,@SyscomText nvarchar(max)
,@Line nvarchar(255)
Select @DefinedLength = 255
SELECT @BlankSpaceAdded = 0 --跟蹤行結束的空格。注意Len函數忽略了多餘的空格
CREATE TABLE #CommentText
(LineId int
,Text nvarchar(255) collate database_default)
--使用#output代替sys.sysobjvalues
DECLARE ms_crs_syscom CURSOR LOCAL
FOR SELECT real_decrypt from #output
ORDER BY ident
FOR READ ONLY
--獲取文本
SELECT @LFCR = 2
SELECT @LineId = 1
OPEN ms_crs_syscom
FETCH NEXT FROM ms_crs_syscom into @SyscomText
WHILE @@fetch_status >= 0
BEGIN
SELECT @BasePos = 1
SELECT @CurrentPos = 1
SELECT @TextLength = LEN(@SyscomText)
WHILE @CurrentPos != 0
BEGIN
--通過回車查找行的結束
SELECT @CurrentPos = CHARINDEX(char(13)+char(10), @SyscomText,
@BasePos)
--如果找到回車
IF @CurrentPos != 0
BEGIN
--如果@Lines的長度的新值比設置的大就插入@Lines目前的內容並繼續
While (isnull(LEN(@Line),0) + @BlankSpaceAdded +
@CurrentPos-@BasePos + @LFCR) > @DefinedLength
BEGIN
SELECT @AddOnLen = @DefinedLength-(isnull(LEN(@Line),0) +
@BlankSpaceAdded)
INSERT #CommentText VALUES
( @LineId,
isnull(@Line, N'') + isnull(SUBSTRING(@SyscomText,
@BasePos, @AddOnLen), N''))
SELECT @Line = NULL, @LineId = @LineId + 1,
@BasePos = @BasePos + @AddOnLen, @BlankSpaceAdded = 0
END
SELECT @Line = isnull(@Line, N'') +
isnull(SUBSTRING(@SyscomText, @BasePos, @CurrentPos-@BasePos + @LFCR), N'')
SELECT @BasePos = @CurrentPos+2
INSERT #CommentText VALUES( @LineId, @Line )
SELECT @LineId = @LineId + 1
SELECT @Line = NULL
END
ELSE
--如果回車沒找到
BEGIN
IF @BasePos <= @TextLength
BEGIN
--如果@Lines長度的新值大於定義的長度
While (isnull(LEN(@Line),0) + @BlankSpaceAdded +
@TextLength-@BasePos+1 ) > @DefinedLength
BEGIN
SELECT @AddOnLen = @DefinedLength -
(isnull(LEN(@Line),0) + @BlankSpaceAdded)
INSERT #CommentText VALUES
( @LineId,
isnull(@Line, N'') + isnull(SUBSTRING(@SyscomText,
@BasePos, @AddOnLen), N''))
SELECT @Line = NULL, @LineId = @LineId + 1,
@BasePos = @BasePos + @AddOnLen, @BlankSpaceAdded = 0
END
SELECT @Line = isnull(@Line, N'') +
isnull(SUBSTRING(@SyscomText, @BasePos, @TextLength-@BasePos+1 ), N'')
if LEN(@Line) < @DefinedLength and charindex(' ',
@SyscomText, @TextLength+1 ) > 0
BEGIN
SELECT @Line = @Line + ' ', @BlankSpaceAdded = 1
END
END
END
END
FETCH NEXT FROM ms_crs_syscom into @SyscomText
END
IF @Line is NOT NULL
INSERT #CommentText VALUES( @LineId, @Line )
select Text from #CommentText order by LineId
CLOSE ms_crs_syscom
DEALLOCATE ms_crs_syscom
DROP TABLE #CommentText
-- -------------------------------------
--結束從sp_helptext提取
-- -------------------------------------
--刪除用短橫線創建的存儲過程並重建原始的存儲過程
ROLLBACK TRAN
DROP TABLE #output
go

⑺ 怎麼解決

stored proceres 是系統自帶的或用戶自己編寫的,由SQL語句組成的過程 External stored procere 是調用外部DLL來創建的過程。

⑻ 什麼是sql中的stored proceres

stored proceres 就是存儲過程,就是已經命名的代碼段。
這個和一般編程語言中的方法(函數)類似,可以實現循環、IF判斷、異常處理等等。

⑼ 在DB2中創建Store procere時出線的錯誤SQL0440N怎麼解決

檢查看你是不是改動了表裡的某列列名,及關聯的項.導致數據讀取時,某些數據讀不出來而出錯!

⑽ sql語句里怎麽調用storeprocere

sql語句中只能執行函數,不能執行存儲過程。比如 select 函數(參數) from al 你說的是在Navicat工具里執行存儲過程嗎? 試試這個 declareid varcahr2(100);call CALLCENTER_CHECK_CALLERID(mobile,id);end;