我有一张名为 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 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)
,这可能不是您想要的。