GRANT/DENY/REVOKE 權限。sp_ 開頭,管理/監控用。CREATE { PROC | PROCEDURE } [schema_name.] procedure_name [; number]
[ @parameter [type_schema_name.] data_type ]
[ VARYING ] [ = default ] [ OUT[PUT] ] [ ,...n ]
[ WITH [ ,...n ] ]
[ FOR REPLICATION ]
AS { [;][ ,...n ] | }
[;]
::= [ ENCRYPTION ] [ RECOMPILE ] [ EXECUTE AS Clause ]
::= { [ BEGIN ] statements [ END ] }
::= EXTERNAL NAME assembly_name.class_name.method_name
CREATE SCHEMA yangyang8848;
GO
CREATE PROC yangyang8848.AllGoods AS SELECT * FROM Master_Goods;
GO
-- 執行需加 Schema:EXEC yangyang8848.AllGoods
同名程序可加編號分組(;1, ),DROP PROC 刪除整組。
OUTPUT/OUT 等價,標示輸出參數。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 @VV2 OUT;
將建立語句原始碼模糊化,sys.sql_modules、sp_helptext 均不可見。僅限特權用戶(DAC 連線、除錯器附加)可還原。適用於保護智慧財產權。
不快取執行計畫,每次執行重新編譯。適用於參數嗅探問題嚴重、資料分佈劇烈變動的場景。CLR 程序不可用。
IF OBJECT_ID('yangyang8848.OneGoods') IS NOT NULL
DROP PROC yangyang8848.OneGoods;
GO
CREATE PROC ...
避免重複建立報錯,部署腳本必備。
-- 程序 1:回傳游標
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
-- 程序 2:消費游標
CREATE PROC GetAllGoodsIDAndName
AS
DECLARE @GoodsCode VARCHAR(18), @GoodsName NVARCHAR(20), @MasterGoodsCursor CURSOR;
EXEC GetMasterGoods @MasterGoodsCursor OUT;
FETCH NEXT FROM @MasterGoodsCursor INTO @GoodsCode, @GoodsName;
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @GoodsCode + ':' + @GoodsName;
FETCH NEXT FROM @MasterGoodsCursor INTO @GoodsCode, @GoodsName;
END
CLOSE @MasterGoodsCursor;
DEALLOCATE @MasterGoodsCursor;
GO
執行 EXEC GetAllGoodsIDAndName 即可列印所有商品代碼與名稱。