sqlserver函數與過程(二)

過程

  • SQLserver 過程是具有特定功能,可多次對數據表操作的獨立模塊。
  • 返回值通常用return 返回整數 0,1…。(可選)
  • 也可通過output 參數或select 語句返回結果集。

1.過程的定義

本過程定義了一個過程,輸入一個動態SQL語句,將結果行集組成一個SQL命令串,返回結果。該過程使用Function 是不能完成的。

CREATE PROCEDURE [dbo].[getCmd]@CursorStr nvarchar(max),@Str nvarchar(max)='' out
as
beginset nocount on;declare @s nvarchar(max)='';set @CursorStr=' declare Cur cursor for '+@CursorStr;exec sp_executeSql @CursorStr;open Cur;FETCH NEXT FROM Cur INTO @s;WHILE @@FETCH_STATUS = 0BEGINSET @Str=@Str+@s;FETCH NEXT FROM  Cur INTO @s; endclose Cur;--關閉標量庫deallocate Cur;--釋放光標空間  return 0;
end

2.過程的調用

DECLARE @IndexSQL NVARCHAR(MAX);
declare @ic nvarchar(max);
set @ic=@oldDb+'.sys.index_columns';
--declare @c nvarchar(max);
set @c=@oldDb+'.sys.columns';
declare @i nvarchar(max);
set @i=@oldDb+'.sys.indexes';
--declare @t nvarchar(max);
set @t=@oldDb+'.sys.tables';
SET @IndexSQL = '';
set @cmd='
SELECT  ''CREATE '' + CASE WHEN i.is_unique = 1 THEN ''UNIQUE '' ELSE '''' END + i.type_desc + '' INDEX '' + QUOTENAME(i.name) + '' ON '+@newDb+'.dbo.'' + QUOTENAME(t.name) + '' ('' + STUFF((SELECT '', '' + QUOTENAME(c.name)FROM '+@ic+' icJOIN '+@c+' c ON ic.column_id = c.column_id AND ic.object_id = c.object_idWHERE ic.object_id = i.object_id AND ic.index_id = i.index_id AND ic.is_included_column = 0ORDER BY ic.key_ordinalFOR XML PATH(''''), TYPE).value(''.'', ''NVARCHAR(MAX)''), 1, 2, '''') + '')'' + CASE WHEN EXISTS (SELECT *FROM '+@ic+' icJOIN zwdb.sys.columns c ON ic.column_id = c.column_id AND ic.object_id = c.object_idWHERE ic.object_id = i.object_id AND ic.index_id = i.index_id AND ic.is_included_column = 1) THEN '' INCLUDE ('' + STUFF((SELECT '', '' + QUOTENAME(c.name)FROM '+@ic+' icJOIN '+@c+' c ON ic.column_id = c.column_id AND ic.object_id = c.object_idWHERE ic.object_id = i.object_id AND ic.index_id = i.index_id AND ic.is_included_column = 1ORDER BY ic.index_column_idFOR XML PATH(''''), TYPE).value(''.'', ''NVARCHAR(MAX)''), 1, 2, '''') + '')'' ELSE '''' END + '';'' + CHAR(13) + CHAR(10) COLLATE Chinese_PRC_CI_AS AS combined_column 
FROM '+@i+' i
JOIN '+@t+' t ON i.object_id = t.object_id
WHERE i.is_primary_key = 0 AND i.is_unique_constraint = 0 AND t.is_ms_shipped = 0 AND i.index_id > 0;';
exec zwdb.dbo.getCmd @CursorStr=@cmd,@Str=@IndexSQL output ;
IF @IndexSQL <> ''EXEC sp_executesql @IndexSQL;

總結

1. 數據修改能力

(1)標量函數:

  • 不允許修改數據(如 INSERT、UPDATE、DELETE)。
  • 只能讀取數據,保持函數的確定性(相同輸入始終返回相同輸出)。

(2)存儲過程:

  • 允許修改數據,支持事務處理(如 BEGIN TRANSACTION)。
  • 可執行任何 T-SQL 語句,包括動態 SQL。

2. 性能與優化

(1)標量函數:

  • 性能較低,尤其在 WHERE 子句中頻繁調用時,可能導致全表掃描。
  • 適合簡單計算,避免復雜邏輯。

(2)存儲過程:

  • 性能較高,執行計劃可緩存,減少編譯開銷。
  • 適合復雜業務邏輯(如批量數據處理)。

3. 應用場景

(1)標量函數:

  • 數據計算(如格式化日期、字符串處理)。
  • 在查詢中作為表達式使用(如 SELECT、JOIN 條件)。

(2)存儲過程:

  • 業務邏輯封裝(如用戶認證、訂單處理)。
  • 數據修改操作(如批量插入、事務處理)。
  • 跨數據庫操作或調用外部資源(如調用 API)。

4. 其他差異

特性標量函數存儲過程
事務支持不支持支持(可使用 BEGIN TRANSACTION)
動態 SQL不允許允許
權限控制可通過 GRANT EXECUTE 授權同上
在視圖中使用允許不允許(視圖中不能直接調用存儲過程)
結果集返回不支持(只能返回單個值)支持(通過 SELECT 語句)

總結

場景推薦使用標量函數推薦使用存儲過程
簡單計算(如數學公式)??
查詢中作為表達式??
數據修改(INSERT/UPDATE)??
復雜業務邏輯??
事務處理??
動態 SQL??

建議:

優先使用存儲過程處理業務邏輯,使用標量函數處理簡單計算,避免在大型數據集上頻繁調用函數。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/86775.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/86775.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/86775.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OpenCV學習3

1、創建圖像窗口滑動條 OpenCV 4中通過createTrackbar()函數在顯示圖像的窗口上創建滑動條。 int cv::createTrackbar(const String &trackbarname,const String &winname, int *value, int count, TrackbarCallback onChange 0, void *us…

SRS流媒體服務器之本地測試rtc推流bug

SRS環境版本 commit 44f0c36b61bc7c3a1d51cb60be0ec184c840f09d Author: winlin <winlinvip.126.com> Date: Wed Aug 2 10:34:41 2023 0800 Release v4.0-r5, 4.0 release5, v4.0.271, 145574 lines. bug1: 無法推流 WebRTC推流必須是HTTPS或者localhost&#xff1a;Ht…

物理服務器是指的什么?作用有哪些?-哈爾濱云前沿

物理服務器是一種基于傳統硬件架構構建的服務器&#xff0c;物理服務器是具有處理器、硬盤和網絡接口等硬件組件的獨立服務器&#xff0c;可以用于托管和存儲數據服務&#xff0c;&#xff0c;是計算機網絡的核心組件之一&#xff0c;本文就來詳細了解一下物理服務器。 物理服務…

Lua現學現賣

一、Lua的變量類型 全局變量&#xff1a;MyVar 局部變量&#xff1a;local MyVar 二、Lua的數據類型 1.nil&#xff1a;一個空值 類似C的nullptr 2.Boolean&#xff1a;true/false 類似C的bool 3.string&#xff1a;字符串 類似C的std::string 4.Number&#xff1a;數字 類似C…

(24)如何在 Qt 里創建 c++ 類,以前已經學習過如何在 Qt 里引入資源圖片文件。以及如何為繼承于 Qt已有類的自定義類重新實現虛函數

&#xff08;1&#xff09; 如何在Qt里創建 c 類 &#xff1a; 效果圖如下 &#xff1a; &#xff08;2&#xff09;開始完善自定義類里面的成員函數 &#xff1a; 接著 &#xff1a; 以及 &#xff1a; 接著重新實現這些繼承來的虛函數就可以了。 &#xff08;3&#xff09…

怎樣優化HDFS的網絡傳輸

優化HDFS&#xff08;Hadoop Distributed File System&#xff09;的網絡傳輸可以從多個方面入手&#xff0c;以下是一些常見的優化策略&#xff1a; 1. 網絡硬件升級 增加帶寬&#xff1a;使用更高帶寬的網絡設備&#xff0c;如10Gbps或更高速度的交換機和網卡。減少延遲&am…

深入探索 Pdfium.Net:在 .NET 中處理和渲染 PDF 文件

在現代軟件開發中&#xff0c;PDF 文件的處理變得愈加重要&#xff0c;尤其是在文檔管理、報表生成和在線內容展示等領域。為了高效地處理和渲染 PDF 文件&#xff0c;開發者通常會選擇一些強大的 PDF 處理庫。而 Pdfium.Net&#xff0c;作為 PDFium 庫的 .NET 封裝&#xff0c…

當無人機遇到AI智能體:多領域自主空中智能和無人機智能體綜述

作者&#xff1a;Ranjan Sapkota, Konstantinos I. Roumeliotis, Manoj Karkee 單位&#xff1a;康奈爾大學生物與環境工程系&#xff0c;希臘伯羅奔尼撒大學信息與電信系 論文標題&#xff1a;UAVs Meet Agentic AI: A Multidomain Survey of Autonomous Aerial Intelligenc…

從 0 到 1 玩轉 React:打造你的趣味美食相冊

想象一下&#xff0c;你想制作一個超酷的 “美食相冊” 網頁&#xff0c;能展示各種美食圖片&#xff0c;還能隨時切換查看不同美食。這聽起來是不是很有趣&#xff1f;別擔心&#xff0c;React 能幫你輕松實現&#xff01;作為前端開發領域最受歡迎的庫之一&#xff0c;React …

深入淺出:RocketMQ與Kafka的雙劍合璧,實現高可用與高吞吐

本文在創作過程中借助 AI 工具輔助資料整理與內容優化。圖片來源網絡。 文章目錄 引言一、RocketMQ與Kafka的江湖地位1.1 RocketMQ的獨門絕技1.2 Kafka的凌厲攻勢 二、雙劍合璧的策略&#xff1a;雙寫隊列2.1 策略概述2.2 代碼實現 三、雙劍合璧的實戰應用3.1 電商訂單處理3.2 …

Apache POI-02.入門案例-通過POI向Excel文件寫入文件內容-通過POI讀取Excel文件內容

一.入門案例 向excel文件中寫入并讀出 package com.sky.test;import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; impor…

MongoDB06 - MongoDB 地理空間

MongoDB06 - MongoDB 地理空間 文章目錄 MongoDB06 - MongoDB 地理空間一&#xff1a;地理空間數據基礎1&#xff1a;地理數據表示方式1.1&#xff1a;GeoJSON 格式1.2&#xff1a;傳統坐標對 2&#xff1a;地理空間索引2.1&#xff1a;2dsphere 索引2.2&#xff1a;2d索引2.3&…

Bugku——WEB篇(持續更新ing)

目錄 一、滑稽 二、計算器 方法一 方法二 三、alert 四、你必須讓他停下 五、頭等艙 六、GET 七、POST 方法一 方法二 八、source 九、矛盾 十、備份是個好習慣 一、滑稽 1.啟動環境后&#xff0c;訪問URL&#xff0c;頁面出現了一堆滑稽表情 2.按f12(或fnf12)打…

Linux 網絡命名空間的奧秘:深入解析struct net與內核模塊編譯陷阱

引言:網絡隔離的基石 在Linux容器化技術(如Docker)和云計算網絡中,網絡命名空間是實現網絡隔離的核心機制。每個隔離的網絡環境都由一個關鍵的內核數據結構描述——struct net。這個結構體不僅是網絡隔離的技術基礎,也是內核開發者常遇到的編譯陷阱源頭。 一、解剖網絡命…

idea的EasyCode插件連接瀚高數據庫(APP)

文章目錄 環境癥狀問題原因解決方案 環境 系統平臺&#xff1a;Linux x86-64 Red Hat Enterprise Linux 7 版本&#xff1a;5.6.5 癥狀 客戶在idea工具中使用EasyCode插件連接瀚高數據庫的企業版時&#xff0c;連接設置的url中提示“jdbc:highgo不存在”的錯誤 問題原因 E…

VMware設置虛擬機為固定IP

1. 修改虛擬網絡編輯器 打開虛擬機網絡“編輯” 點擊“VMnet8” 選擇“NAT”模式 修改網關&#xff1a;前面的不要修改&#xff0c;最后一位設置為“1”&#xff0c;然后確定 記住這里的網關&#xff0c;后面的配置要保持一致 設置子網IP和子網掩碼&#xff1a;一般就…

智核引擎融合生成式AI,重塑企業知識圖譜與研發創新范式!

目錄 系統架構設計核心實現步驟步驟1&#xff1a;知識圖譜構建與數據預處理步驟2&#xff1a;生成式AI與知識圖譜融合&#xff08;RAG增強&#xff09;步驟3&#xff1a;智能推理工作流 核心流程可視化企業級部署方案性能優化策略應用場景示例結語 本文將手把手實現企業級知識圖…

LogisticRegression(solver = ‘lbfgs‘)的ConvergenceWarning問題解決

&#x1f466;&#x1f466;一個帥氣的boy&#xff0c;你可以叫我Love And Program &#x1f5b1; ?個人主頁&#xff1a;Love And Program的個人主頁 &#x1f496;&#x1f496;如果對你有幫助的話希望三連&#x1f4a8;&#x1f4a8;支持一下博主 LogisticRegression的Co…

web3 docs

區塊鏈重構信任機制&#xff0c;去中心化&#xff0c;用唯一的hash編號來實現防篡改。以數字貨幣的形式交易&#xff0c;個人持有唯一的數字秘鑰(唯一&#xff0c;不可篡改) 詳見 以太坊的白皮書 和 數字貨幣 (加密貨幣實現隱私交易) 底層基礎的很多特點 1.例如p2p&#xf…

AI入門 | 計算自注意力時QK^T的計算復雜度是多少?

0. 背景 假設我們有兩個矩陣&#xff1a; 矩陣 A&#xff0c;尺寸為 (n, d_k)矩陣 B&#xff0c;尺寸為 (d_k, n) 我們要計算它們的乘積 C A * B。 那么這個過程所需的計算量是多少&#xff1f; 1. 結果矩陣的尺寸 首先&#xff0c;結果矩陣 C 的尺寸是由第一個矩陣的行數…