SQLServer之修改存儲過程

来源:https://www.cnblogs.com/vuenote/archive/2018/11/02/9894951.html
-Advertisement-
Play Games

修改存儲過程註意事項 只能修改先前在 SQL Server 中通過執行 CREATE PROCEDURE 語句創建的過程。 Transact-SQL 存儲過程修改為 CLR 存儲過程,反之亦然。 ALTER PROCEDURE 不會更改許可權,也不影響相關的存儲過程或觸發器。 但是,當修改存儲過程時, ...


修改存儲過程註意事項

只能修改先前在 SQL Server 中通過執行 CREATE PROCEDURE 語句創建的過程。

Transact-SQL 存儲過程修改為 CLR 存儲過程,反之亦然。

ALTER PROCEDURE 不會更改許可權,也不影響相關的存儲過程或觸發器。 但是,當修改存儲過程時,QUOTED_IDENTIFIER 和 ANSI_NULLS 的當前會話設置包含在該存儲過程中。 如果設置不同於最初創建存儲過程時有效的設置,則存儲過程的行為可能會更改。

如果原來的過程定義是使用 WITH ENCRYPTION 或 WITH RECOMPILE 創建的,那麼只有在 ALTER PROCEDURE 中也包含這些選項時,這些選項才有效。

使用SSMS資料庫管理工具和T-SQL腳本修改存儲過程語法一致。

使用T-SQL腳本修改存儲過程

語法:

--聲明資料庫引用
use 資料庫名;
go

--修改存儲過程

alter procedure [schema_name][.]procedure_name [;number]
[{ @parameter [type_schema_name.] data_type} [ null | not null ][varying] [ = default ] [ out| output ] [readonly] ] [,......n]
with [encryption][,][recompile][,][execute as clause]
[for replication]
as
begin
sql_statement;
end
go

語法解析:

--schema_name
--過程所屬架構的名稱。 過程是綁定到架構的。如果在創建過程時未指定架構名稱,則自動分配正在創建過程的用戶的預設架構。

--procedure_name
--過程的名稱。 過程名稱必須遵循有關標識符的規則,並且在架構中必須唯一。
--在命名過程時避免使用 sp_ 首碼。 此首碼由 SQL Server 用來指定系統過程。 如果存在同名的系統過程,則使用首碼可能導致應用程式代碼中斷。
--可在 procedure_name 前面使用一個數字元號 (#procedure_name) 來創建局部臨時程式,使用兩個數字元號 (##procedure_name) 來創建全局臨時程式。
--局部臨時程式僅對創建了它的連接可見,並且在關閉該連接後將被刪除。 全局臨時程式可用於所有連接,並且在使用該過程的最後一個會話結束時將被刪除。 對於 CLR 過程,不能指定臨時名稱。
--過程或全局臨時程式的完整名稱(包括 ##)不能超過 128 個字元。 局部臨時程式的完整名稱(包括 #)不能超過 116 個字元。

--; number
--適用範圍: SQL Server 2008 到 SQL Server 2017 和 Azure SQL Database。
--用於對同名的過程分組的可選整數。使用一個 DROP PROCEDURE 語句可將這些分組過程一起刪除。

--@parameter
--在過程中聲明的參數。 通過將 at 符號 (@) 用作第一個字元來指定參數名稱。 參數名稱必須符合標識符規則。 每個過程的參數僅用於該過程本身;其他過程中可以使用相同的參數名稱。
--可聲明一個或多個參數;最大值是 2,100。 除非定義了參數的預設值或者將參數設置為等於另一個參數,否則用戶必須在調用過程時為每個聲明的參數提供值。
--如果過程包含表值參數,並且該參數在調用中缺失,則傳入空表。 參數只能代替常量表達式,而不能用於代替表名、列名或其他資料庫對象的名稱。 有關詳細信息,請參閱 EXECUTE (Transact-SQL)。
--如果指定了 FOR REPLICATION,則無法聲明參數。

--[type_schema_name. [ =] data_type
--參數的數據類型以及該數據類型所屬的架構。
--針對 Transact-SQL 過程的準則:
--所有 Transact-SQL 數據類型都可以用作參數。
--您可以使用用戶定義的表類型創建表值參數。 表值參數只能是 INPUT 參數,並且這些參數必須帶有 READONLY 關鍵字。 有關詳細信息,請參閱使用表值參數(數據引擎)
--游標數據類型只能是 OUTPUT 參數,並且必須帶有 VARYING 關鍵字。
--針對 CLR 過程的準則:
--在托管代碼中具有等效值的所有本機 SQL Server 數據類型都可以用作參數。 有關 CLR 類型與 SQL Server 系統數據類型之間關係的詳細信息,請參閱映射 CLR 參數數據。 有關 SQL Server 系統數據類型及其語法的詳細信息,請參閱數據類型 (Transact-SQL)。
--表值或游標數據類型不能用作參數。
--如果參數的數據類型為 CLR 用戶定義類型,則必須對此類型有 EXECUTE 許可權。

--varying
--指定作為輸出參數支持的結果集。 該參數由過程動態構造,其內容可能發生改變。 僅適用於游標參數。 該選項對於 CLR 過程無效。

--default
--參數的預設值。 如果為參數定義了預設值,則無需指定此參數的值即可執行過程。 預設值必須是常量或 NULL。 該常量值可以採用通配符的形式,這使其可以在將該參數傳遞到過程時使用 LIKE 關鍵字。
--只有 CLR 過程的預設值記錄在 sys.parameters.default 列中。 對於 Transact-SQL 過程參數,該列將為 NULL。

--out|output
--指示參數是輸出參數。 使用 OUTPUT 參數將值返回給過程的調用方。 除非是 CLR 過程,否則 text、ntext 和 image 參數不能用作 OUTPUT 參數。 OUTPUT 參數可以為游標占位符,CLR 過程除外。 不能將表值數據類型指定為過程的 OUTPUT 參數。

--readonly
--指示不能在過程的主體中更新或修改參數。 如果參數類型為表值類型,則必須指定 READONLY。

--encryption
--適用範圍:SQL Server( SQL Server 2008 到 SQL Server 2017)、 Azure SQL Database。
--指示 SQL Server 將 CREATE PROCEDURE 語句的原始文本轉換為模糊格式。 模糊代碼的輸出在 SQL Server 的任何目錄視圖中都不能直接顯示。 對系統表或資料庫文件沒有訪問許可權的用戶不能檢索模糊文本。
--但是,可以通過 DAC 埠訪問系統表的特權用戶或直接訪問數據文件的特權用戶可以使用此文本。 此外,能夠向伺服器進程附加調試器的用戶可在運行時從記憶體中檢索已解密的過程。 有關如何訪問系統元數據的詳細信息,請參閱元數據可見性配置。
--該選項對於 CLR 過程無效。
--使用此選項創建的過程不能作為 SQL Server 複製的一部分發佈。

--recompile
--指示 資料庫引擎不緩存此過程的查詢計劃,這強制在每次執行此過程時都對該過程進行編譯。 有關強制重新編譯的原因的詳細信息,請參閱重新編譯存儲過程。 在指定了 FOR REPLICATION 或者用於 CLR 過程時不能使用此選項。
--若要指示 資料庫引擎放棄過程內單個查詢的查詢計劃,請在該查詢的定義中使用 RECOMPILE 查詢提示。 有關詳細信息,請參閱查詢提示 (Transact-SQL)。

--execute as 子句
--指定在其中執行過程的安全上下文。
--對於本機編譯存儲過程(從 SQL Server 2016 (13.x) 開始和在 Azure SQL Database 中),EXECUTE AS 子句沒有任何限制。 在 SQL Server 2014 (12.x) 中,對於本機編譯的存儲過程,支持 SELF、OWNER 和 ‘user_name’ 子句。
--有關詳細信息,請參閱 EXECUTE AS 子句 (Transact-SQL)。
--SELF
--EXECUTE AS SELF 與 EXECUTE AS user_name 等價,其中指定用戶是創建或更改模塊的用戶。 創建或更改模塊的用戶的實際用戶 ID 存儲在 sys.sql_modules 或 sys.service_queues 目錄視圖的 execute_as_principal_id 列中。
--OWNER
--指定模塊內的語句在模塊的當前所有者上下文中執行。 如果模塊沒有指定的所有者,則使用模塊架構的所有者。 不能為 DDL 或登錄觸發器指定 OWNER。
--' user_name '
--指定模塊內的語句在 user_name 指定的用戶的上下文中執行。 將根據 user_name 來驗證對模塊內任意對象的許可權。 不能為具有伺服器作用域的 DDL 觸發器或登錄觸發器指定 user_name。 請改用 login_name。
--user_name 必須存在於當前資料庫中,並且必須是單一實例帳戶。 user_name 不能為組、角色、證書、密鑰或內置帳戶,如 NT AUTHORITY\LocalService、NT AUTHORITY\NetworkService 或 NT AUTHORITY\LocalSystem。
--執行上下文的用戶 ID 存儲在元數據中,可以在 sys.sql_modules 或 sys.assembly_modules 目錄視圖的 execute_as_principal_id 列查看。
--' login_name '
--指定模塊內的語句在 login_name 指定的 SQL Server 登錄的上下文中執行。 將根據 login_name 來驗證對模塊內任意對象的許可權。 只能為具有伺服器作用域的 DDL 觸發器或登錄觸發器指定 login_name。
--login_name 不能為組、角色、證書、密鑰或內置帳戶,如 NT AUTHORITY\LocalService、NT AUTHORITY\NetworkService 或 NT AUTHORITY\LocalSystem。

--for replication
--適用範圍:SQL Server( SQL Server 2008 到 SQL Server 2017)、 Azure SQL Database。
--指定為複製創建該過程。 因此,它不能在訂閱伺服器上執行。 使用 FOR REPLICATION 選項創建的過程可用作過程篩選器,且僅在複製過程中執行。 如果指定了 FOR REPLICATION,則無法聲明參數。 對於 CLR 過程,不能指定 FOR REPLICATION。 對於使用 FOR REPLICATION 創建的過程,忽略 RECOMPILE 選項。
--FOR REPLICATION 過程在 sys.objects 和 sys.procedures 中包含 RF 對象類型。

--{ [ BEGIN ] sql_statement [;] [ ...n ] [ END ] }
--構成過程主體的一個或多個 Transact-SQL 語句。 您可以使用可選的 BEGIN 和 END 關鍵字將這些語句括起來。 有關信息,請參閱後面的“最佳實踐”、“一般備註”以及“限制和局限”部分。

示例:

--聲明資料庫引用
use testss;
go

--修改存儲過程
alter procedure [dbo].[noreference]
;1
@inputparamter int=null,@outputparamter nvarchar(100)=null output
with encryption,recompile,execute as owner
--for replication
as
begin
if @inputparamter is not null
begin
select * from test1 where id=@inputparamter;
set @outputparamter='我是修改過的有參數的輸出指定值的存儲過程';
end
else
begin
select * from test1;
set @outputparamter='我是修改過的無參數的輸出全部值的存儲過程';
end
end
go

示例結果:本示例演示如何調用存儲過程和存儲過程執行結果。

1、連接資料庫-》選擇資料庫-》展開資料庫-》展開可編程性-》展開存儲過程-》選擇存儲過程-》右鍵點擊-》選擇執行存儲過程。

2、在執行存儲過程彈出框-》輸入存儲過程參數-》點擊確定。

3、存儲過程執行結果。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一.概述 在sql server里臨時表存儲在TempDB庫中,TempDB是一個系統資料庫,它只有Simple恢復模式,也是最小日誌記錄操作。主要用於存放局部臨時表,全局臨時表,表變數,都是基於臨時特征,每次伺服器或服務重啟後,都會按照Model庫的配置重新創建TempDB庫。在sql serve ...
  • 一、 關係型資料庫(sql) 1.建表 二、非關係型資料庫(nosql 98提出的概念) 1.不用建庫建表數據直接存入就可 優缺點: 關係型:節約資源(學生姓名和課程名不重覆出現),開發不方便(需先建庫建表,外鍵等) 非關係型:浪費資源(學生姓名和課程名重覆出現),開發方便(不需要建庫建表,數據直接 ...
  • 在安裝和測試HBase之前,我們有必要先瞭解一下HBase是什麼 我們可以通過下麵的資料對其有一定的瞭解: HBase 官方文檔中文版 HBase 深入淺出 我想把我知道的分享給大家,方便大家交流。 ...
  • 作者:天山老妖S 鏈接:http://blog.51cto.com/9291927 一、自定義函數簡介 自定義函數(user-defined function UDF)是一種對MySQL擴展的途徑,其用法和內置函數相同。 自定義函數的兩個必要條件: A、參數 B、返回值(必須有)。函數可以返回任意類 ...
  • 環境 操作系統:Ubuntu 18.04 MongoDB: 4.0.3 伺服器 首先部署3台伺服器,1台主節點 + 2台從節點 3台伺服器的內容ip分別是: 10.140.0.5 (主節點) 10.140.0.6 (從節點01) 10.140.0.7 (從節點02) 安裝MongoDB 接下來,需要 ...
  • mysql 8.0.13預設有一個data文件夾,這個文件夾得刪了,不然安裝服務時候會有日誌文件提示報錯: Failed to find valid data directory. Data Dictionary initialization failed. 還有,要在mysql文件夾里新建個my. ...
  • array 結構 (1)語法:array(val1,val2,val3,…) 操作類型:array array類型的數據可以通過'數組名[index]'的方式訪問,index從0開始: (2)建表: create external table temp.array_20181101_v2 ( did ...
  • Mysql 二進位安裝方法 下載mysql https://dev.mysql.com/downloads/mysql/ 1.解壓包 tar xf mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz 2.實際生產環境 mv mysql-5.7.24-linux-gl ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...