将表与SQL Server 2005中的存储过程中的表变量进行比较

时间:2011-06-01 13:36:38

标签: sql sql-server sql-server-2005

如何将表与存储过程中的表变量进行比较?通常比较我们使用此查询的两个表:

 SELECT * 
 FROM Table A 
 WHERE NOT EXISTS(SELECT * 
                  FROM Table B 
                  WHERE Table A.ID = Table B.ID)

但是在这里,我有Table A和一个表变量@Item,如表B所示。

在这种情况下,如何比较Table A@Item

我正在编写一个存储过程,在该存储过程中,我想将现有的一个表与从前端生成的表变量进行比较,并将其作为XML数据集传递给存储过程... 在那里,如果表变量@Item中的所有行都出现在现有表中,那么它返回true,否则为false ...

请提出任何建议....

6 个答案:

答案 0 :(得分:4)

在排除一个表的结果时,我总是更喜欢左连接语法:

select a.*
from [table] a
    left outer join @item b
        on a.ID = b.ID
where b.ID is null 

我怀疑查询计划应该是相同的。

答案 1 :(得分:2)

如果工作原理相同(尽管使用表别名会更容易)

SELECT * 
FROM Table A 
WHERE NOT EXISTS(
    SELECT * 
    FROM @Item sub 
    WHERE Table A.ID = sub.ID
)

答案 2 :(得分:1)

如果你正在使用子查询,你可以做同样的事情

select *
from tableA
where not in(
 select b.ID
 from @tableB)

@tableB只是一个表值参数,而不是临时表。它是一个包含表格的变量,因此它可以在函数之间传递。

你也可以做类似的事情:

select *
from tableA a
left outer join @tableB b
on a.ID = b.ID
where b.ID IS NULL

答案 3 :(得分:1)

像普通表一样引用表变量:

SELECT * FROM Table A 
WHERE NOT EXISTS(SELECT * FROM @ITEM WHERE Table A.ID = @ITEM.ID)

答案 4 :(得分:1)

如果要比较整个表,并且模式保证相同,则可以使用EXCEPT

SELECT *, 'New row' [Edit] FROM [Table A]
EXCEPT
SELECT * FROM @Item

UNION ALL

SELECT *, 'Deleted row' FROM @Item
EXCEPT
SELECT * FROM [Table A]

答案 5 :(得分:0)

您也应该使用Joins尝试下面的内容。

SELECT * FROM Table A 
Left Join @Item sub on A.ID = sub.ID
Where sub.ID is Null