表值參數sql
SQL Server存儲過程是SQL資料庫的重要組成部分,其中可以用到許多參數。在SQL Server存儲過程中,支持輸入(Input)、輸出參數(Output),也支持返回值參數(ReturnValue)。
返回值參數不是一個形參,而類似於編程中的返回值類型。它都是通過Return語句來返回的,而且在SQL Server中,必須返回INT型的數據,而且很顯然,只能有一個返回值,因為RETURN語句其實是會終止SQL Server存儲過程的。
例子:
ALTERPROCEDURE[dbo].[GetCustomers]
(@rowcountINTOUTPUT)
AS
SELECT[CustomerID]
,[CompanyName]
,[ContactName]
,[ContactTitle]
,[Address]
,[City]
,[Region]
,[PostalCode]
,[Country]
,[Phone]
,[Fax]
FROM[Northwind].[dbo].[Customers]
SET@rowcount=@@rowcount
『貳』 sql server 2008 表值參數在哪
SQL SERVERE 2008 新穎之處在於表值參數(TVPS)。基本思想是數據表可以在客戶端應用程序
或者T-SQL 中創建並填充。然後作力一個數據表變數傳遞到存儲過程 或者由用戶自定義的函數中。
這並不是一件要有可無的事情。
DEMO:
//訂單表
CREATE TABLE dbo.Orders(
OrderId INT NOT NULL IDENTITY CONSTRAINT ORDERSPK PRIMARY KEY,
OrderDate DATETIME,
CustomerID INT
)
//訂單明細表
CREATE TABLE dbo.OrderDetails(
OrderId INT NOT NULL CONSTRAINT orderdetailFkOrders REFERENCES Orders,
LineNumber SMALLINT NOT NULL,
ProctID INT
)
---數據表類型
CREATE TYPE OrderDetailsType as TABLE
(
LineNumber INT,
ProctID INT,
IsNew BIT,
IsDirty BIT,
IsDeleted BIT
)
『叄』 sql2005中 表值函數是什麼
表值函數是資料庫中一種較為特殊的函數類型,它的返回值不再只是一個數值或一個字元串,而是一張數據表。也就是說表值函數返回的是
table
數據類型。對於內聯表值函數,沒有函數主體;表是單個
SELECT
語句的結果集。使用表值函數的時候,把函數直接當成是表或視圖使用,表值函數的參數傳入方法與標量函數沒有區別。
『肆』 SQL Server存儲過程中使用表值作為輸入參數示例
在2008之前如果我們想要將表作為輸入參數傳遞給SQL
Server存儲過程使比較困難的,可能需要很多的邏輯處理將這些表數據作為字元串或者XML傳入。
在2008中提供了表值參數。使用表值參數,可以不必創建臨時表或許多參數,即可向
Transact-SQL
語句或常式(如存儲過程或函數)發送多行數據,這樣可以省去很多自定義的代碼。這樣的操作對於存儲過程內基於表函數的操作變得非常容易操作。
表值參數是使用用戶定義的表類型來聲明的。所以使用之前要先定義表類型。
/*
創建表類型.*/
CREATE
TYPE
LocationTableType
AS
TABLE
(
LocationName
VARCHAR(50)
,
CostRate
INT
);
GO
/*
創建一個存儲過程以表值參數作為輸入.
*/
CREATE
PROCEDURE
dbo.
usp_InsertProctionLocation
@TVP
LocationTableType
READONLY
AS
SET
NOCOUNT
ON
INSERT
INTO
Proction.Location
(Name
,CostRate
,Availability
,ModifiedDate)
SELECT
*,
0,
GETDATE()
FROM
@TVP;
GO
/*
聲明表值參數變數.*/
DECLARE
@LocationTVP
ASLocationTableType;
/*
將數據插入表值變數*/
INSERT
INTO
@LocationTVP(LocationName,
CostRate)
SELECT
Name,
0.00
FROM
Person.StateProvince;
/*
將變數傳遞給存儲過程*/
EXEC
usp_InsertProctionLocation@LocationTVP;
GO
查詢表Proction.Location可以看到數據已經插入了。
『伍』 如何在SQL Server中批量導入數據
方案一、循環導入
實現方式是利用資料庫訪問類調用存儲過程,利用循環逐條插入。很明顯,這種方式效率並不高
方案二、使用Bulk插入
bulk方法主要思想是通過在客戶端把數據都緩存在Table中,然後利用SqlBulkCopy一次性把Table中的數據插入到資料庫,效率非常高
方案三:
利用SQLServer2008的新特性--表值參數(Table-Valued Parameter)。表值參數是SQLServer2008才有的一個新特性,使用這個新特性,我們可以把一個表類型作為參數傳遞到函數或存儲過程里。
方案四:
對於單列欄位,可以把要插入的數據進行字元串拼接,最後再在存儲過程中拆分成數組,然後逐條插入。查了一下存儲過程中參數的字元串的最大長度,然後除以欄位的長度,算出一個值,很明顯是可以滿足要求的,只是這種方式跟第一種方式比起來,似乎沒什麼提高,因為原理都是一樣的。
方案五:
考慮非同步創建、消息隊列等等。這種方案無論從設計上還是開發上,難度都是有的。