我想知道如何創建一個存盤程序,該程序將在引數中接受多個值并回傳多行。
這將是我的引數,classId接受多個值并插入具有相同學生姓名的多行:
@studentName AS NVARCHAR(255) = NULL,
@classId AS INTEGER = NULL
INSERT INTO studentClass (classId, studentName)
VALUES (@classId, @studentName)
示例 John Doe 已注冊到 1 級和 2 級,我想將 Jane Doe 添加到 1 級和 3 級。如何在一次運行中完成?
classId | studentName
-------- ------------
1 | John Doe
2 | John Doe
使用引數運行存盤程序:
@studentName = Jane Doe
@classId = 1,3
并會導致這個
classId | studentName
-------- ------------
1 | John Doe
2 | John Doe
1 | Jane Doe
3 | Jane Doe
uj5u.com熱心網友回復:
就像評論中提到的戴爾一樣,您可以將表值引數與用戶定義的表型別一起使用,以在您的程序中創建一個引數,該引數一次接受一個資料表。
例如首先:
-- Create user-defined table type
CREATE TYPE ClassIdsTable AS TABLE (ClassId INT);
然后:
-- Create procedure with table valued parameter
CREATE PROCEDURE dbo.InsertStudentClasses
@StudentName NVARCHAR(255),
@ClassIds ClassIdsTable
AS
-- Insert into studentClass table
INSERT INTO studentClass (classId, studentName)
SELECT ClassId, @StudentName
FROM @ClassIds;
-- Return results from procedure
SELECT ClassId, @StudentName
FROM @ClassIds;
然后你可以像這樣呼叫你的程序:
DECLARE @ClassIdsTable AS ClassIdsTable;
INSERT INTO @ClassIdsTable
VALUES (1), (3);
EXEC dbo.InsertStudentClasses
@StudentName = 'Jane Doe',
@ClassIds = @ClassIdsTable;
或者,如果您使用的是 SQL Server 2016 或更高版本,您還可以將 @ClassIds 引數創建為基于字串的資料型別,并改為發送以逗號分隔的 ID 串列。然后您可以使用該STRING_SPLIT()函式將其轉換為值表。但是在單個字串中存盤多個資料點有點反模式并且有缺點。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/536648.html
標籤:数据库sql服务器
