SQLserver2008如何把表格變數傳遞到存儲過程中

来源:http://www.cnblogs.com/klsw/archive/2016/04/29/5445532.html
-Advertisement-
Play Games

在Microsoft SQL Server 2008中,你可以實現把表格變數傳遞到存儲過程中,如果變數可以被聲明,那麼它就可以被傳遞。下麵我們來具體介紹如何把表格變數(包括內含的數據)傳遞到存儲過程和功能中去。 傳遞表值參數 用戶經常會碰到許多需要把數值容器而非單個數值放到存儲過程里的情況。對於大部 ...


Microsoft SQL Server 2008中,你可以實現把表格變數傳遞到存儲過程中,如果變數可以被聲明,那麼它就可以被傳遞。下麵我們來具體介紹如何把表格變數(包括內含的數據)傳遞到存儲過程和功能中去。 

 

傳遞表值參數 用戶經常會碰到許多需要把數值容器而非單個數值放到存儲過程里的情況。對於大部分的編程語言而言,把容器數據結構傳遞到常式里或傳遞出來是很常見而且很必要的功能。TSQL也不例外。SQL Server 2000通過OPENXML可以實現這個功能,用戶可以把數據存儲為VARCHAR數據類型然後進行傳遞。到了SQL Server 2005,隨著 XML數據類型以及XQuery的出現,這個功能變得容易一點。但用戶仍然需要對XML數據進行組建和粉碎才能夠使用它,因此這個功能使用起來並不簡單。SQL Server 2008則能夠把表值數據類型傳遞到存儲過程和功能中,從而大大地簡化了編程的工作,因為程式員無需再花心思去組建和解析XML數據了。該功能還可以讓客戶方開發員傳遞客戶方數據表格到資料庫中。 

怎樣傳遞表格參數以銷售為例,首先建立一個 my SalesHistory表格,裡面包含了產品銷售的信息。寫以下腳本就可以在資料庫里創建你選擇的表格:

 

IF OBJECT_ID(‘SalesHistory‘)>0 

DROP TABLE SalesHistory; 

GO 

CREATE TABLE [dbo].[SalesHistory] (

[SaleID] [int] IDENTITY(11) NOT NULL PRIMARY KEY, 

[Product] [varchar](10) NULL, 

[SaleDate] [datetime] NULL, 

[SalePrice] [money] NULL ) 

GO

建立表值參數第一步是創建確切的表格類型,這一步非常重要,因為這樣你就可以在資料庫引擎里定義表格的結構,讓你可以在需要的時候在過程代碼里使用該表格。下麵的代碼創建 SalesHistoryTableType 表格類型定義: 

 

CREATE TYPE SalesHistoryTableType AS TABLE (

[Product] [varchar](10) NULL, 

[SaleDate] [datetime] NULL, 

[SalePrice] [money] NULL ) 

GO

如果想要查看系統里其他類型的表格類型定義,你可以執行下麵這個查詢命令,查看系統目錄: SELECT * FROM sys.table_types我們需要定義用來處理表值參數的存儲過程。下麵這個程式能夠接受指定SalesHistoryTableType類型的表值參數,並載入到SalesHistory中,表值參數在Product列中的值為“BigScreen”

 

CREATE PROCEDURE usp_InsertBigScreenProducts ( 

@TableVariable SalesHistoryTableType READONLY ) 

AS 

BEGIN 

INSERT INTO SalesHistory ( Product, SaleDate, SalePrice ) 

SELECT Product, SaleDate, SalePrice 

FROM @TableVariable WHERE Product = ‘BigScreen‘ 

END 

GO

 

傳遞的表格變數還可以用做任何其他表格的查詢數據。 傳遞表值參數功能的局限性 在傳遞表值變數到程式中時必須使用 READONLY從句。表格變數里的數據不能做修改——除了修改你可以把數據用於任何其他的操作。另外,你也不能把表格變數用做OUTPUT參數——只能用做input參數。 使用自己的新表格變數類型 首先,要聲明一個變數類型SalesHistoryTableType,不需要再一次定義表格結構,因為在創建這個表格類型的時候已經定義過了。 以下是代碼片段:

 

DECLARE @DataTable AS SalesHistoryTableType

--The following script adds 1000 records into my @DataTable table variable:

DECLARE @i SMALLINT

SET @i = 1

WHILE (@i <=1000)

BEGIN

INSERT INTO @DataTable(Product,SaleDate,SalePrice)

VALUES('Computer',DATEADD(mm,@i,'3/11/1919'),DATEPART(ms,GETDATE()) + (@i + 57))

INSERT INTO @DataTable(Product, SaleDate, SalePrice)

VALUES('BigScreen', DATEADD(mm, @i, '3/11/1927'), DATEPART(ms, GETDATE()) + (@i + 13))

INSERT INTO @DataTable(Product, SaleDate, SalePrice)

VALUES('PoolTable', DATEADD(mm, @i, '3/11/1908'), DATEPART(ms, GETDATE()) + (@i + 29))

SET @i = @i + 1

END

 

只要把數據載入到表格變數里,就可以把結構傳遞到存儲過程中。 註意:當表格變數作為參數傳遞後,表格會在存儲在tempdb系統資料庫里,而不是傳遞整個數據集在記憶體里。因為這樣保證高效處理大批量數據。所有伺服器方的表格變數參數傳遞都是通過使用reference調用tempdb中的表格。 EXECUTE usp_InsertBigScreenProducts @TableVariable = @DataTable想要查詢程式是否和預想效果一樣,可以執行以下查詢來看記錄是否已經插入到 SalesHistory表格中: SELECT * FROM SalesHistory結論: 雖然SQL Server 2008資料庫的參數傳遞功能的使用還有一些局限性,比如不能修改參數中的數據和把變數用於output,但它已經很大程度的提高了程式性能,它可以減少server往返旅程數、利用表格限制並擴展編程在資料庫引擎中的功能。


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

-Advertisement-
Play Games
更多相關文章
  • 半同步複製是在主從同步複製的基礎之上,主從同步前面我的博文有介紹 Semisynchronous Replication(半同步複製)則一定程度上保證提交的事務已經傳給了至少一個備庫 MySQL在載入並開啟Semi-sync插件後,每一個提交的事務需等待至少一個備庫接收日誌後才返回給客戶端。如果做的 ...
  • 介紹 本章主要介紹怎樣對比資料庫的表結構的差異,這裡主要介紹使用mysqldiff工具來對比表結構的差異,其實在5.6版本之後通過查詢information庫中的系統表也能對比出來,但是mysqldiff還有一個好處就是可以直接生產差異的SQL語句這個功能就是我們需要利用的,而通過分析系統表要實現這 ...
  • 最近有個哥們在群里問,有一個日誌,裡面存的是IP地址(一行一個),如何將這些IP快速導入到Redis中。 我剛開始的建議是Shell+redis客戶端。 今天,查看Redis官檔,發現文檔的首頁部分(http://www.redis.io/documentation)有一個專門的主題是講述“Redi ...
  • 我是oracle 界的小白,由於公司領導要求,不得不硬著頭皮在網上找rman備份還原的方法,廢話不多說,具體看例子(window) 運行CMD; rman target 管理員賬號/密碼@orcl 備份run{allocate channel d1 device type disk format ' ...
  • 在mysql中,有時我們在做資料庫查詢時,需要得到某欄位中包含某個值的記錄,但是它也不是用like能解決的,使用like可能查到我們不想要的記錄,它比like更精準,這時候mysql的FIND_IN_SET函數就派上用場了,下麵來具體瞭解一下。 FIND_IN_SET(str,strlist)函數 ...
  • 一、開篇 在進行配置只讀路由的時候,需要進行配置可用性組中的可用性副本,如下如所示: 每一項都是啥意思可以看看這個鏈接 https://msdn.microsoft.com/zh-cn/library/hh213002(v=sql.120).aspx 在“可用性副本屬性”對話框中,可以更改主角色和輔 ...
  • MySQL包含對觸發器的支持。觸發器是一種與表操作有關的資料庫對象,當觸發器所在表上出現指定事件時,將調用該對象,即表的操作事件觸發表上的觸發器的執行。 創建觸發器在MySQL中,創建觸發器語法如下: 代碼如下: CREATE TRIGGER trigger_nametrigger_timetrig ...
  • 1.安裝mysql-5.5的yum源 2.修改安裝好的yum源 編輯 /etc/yum.repos.d/mysql-community.repo文件,將5.5的enabled改為1,5.6的enabled改為0 3.安裝mysql-5.5 4.調整配置 編輯 /etc/my.cnf 文件 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...