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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...