在存储过程中使用TVP删除记录[重复]

问题描述 投票:0回答:1

我有一张名为 Student 的表

sno    Name    Course    Fee    Section
1      AAA     BCA       10000   A
2      BBB     BCom      9000    B
3      CCC     BTech     12000   B

我创建了一个名为 Course_tvp_tbl 的临时表

CREATE TYPE dbo.Course_tvp_tbl AS TABLE (course VARCHAR(25) NOT NULL PRIMARY KEY (course))

并将值插入到该临时表中。

course
BTech

现在我想删除临时表课程列中课程所在学生的值。 我们可以直接使用 in 子句,但是,表量很大,而且我的 in 子句当然会包含 1000 个 id。我想使用带有表值参数的存储过程。

CREATE PROCEDURE DBO.DELETE_STUDENTS
    @section char(1),
    @course_tbl dbo.Course_tvp_tbl READONLY 
    AS
    BEGIN
        SET NOCOUNT ON;
        DELETE FROM Student where section = @section and course IN (SELECT course FROM @course_tbl)
    END

存储过程删除查询是否有问题。如何在删除查询 In 子句中使用临时表 course 列?

遵循TVP示例并希望使用tvp列从主表中删除行

sql sql-server stored-procedures table-valued-parameters
1个回答
0
投票

你所写的应该可以正常工作;对于现代关系数据库(例如 SQL Server)中的数据操作而言,数千条记录实际上并不算多。

您还可以通过在

Student
@course_tbl
之间进行内部联接来实现您的目标,如果它可以利用表变量上的聚集索引,这可能会给您带来轻微的性能提升(我还没有测试过查询计划)这些;
IN
子句可能会为您提供与联接方法相同的查询计划,但一般来说,如果您能摆脱它,联接将比
IN
子句执行得更好)。

看起来像:

delete s
from Student s
inner join @course_tbl ct
    on s.course = ct.course
where s.section = @section

此外,正如一些评论中指出的那样,您可能希望为

@section
变量指定一个长度(例如
char(10)
而不是
char
varchar(30)
而不是
varchar
)。不指定长度可能会导致它被视为
char(1)
,这可能不是您想要的。

© www.soinside.com 2019 - 2024. All rights reserved.