Сравните таблицу с табличной переменной в хранимой процедуре в SQL Server 2005 - PullRequest
2 голосов
/ 01 июня 2011

Как сравнить таблицу с табличной переменной в хранимой процедуре? Обычно для сравнения двух таблиц мы использовали этот запрос:

 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 ]

4 голосов
/ 01 июня 2011

Я всегда предпочитал синтаксис левого соединения при исключении результатов из одной таблицы:

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

Я подозреваю, что план запроса должен получиться таким же.

2 голосов
/ 01 июня 2011

Если работает точно так же (хотя использование псевдонимов таблицы сделает это проще)

SELECT * 
FROM Table A 
WHERE NOT EXISTS(
    SELECT * 
    FROM @Item sub 
    WHERE Table A.ID = sub.ID
)
1 голос
/ 01 июня 2011

Если вы хотите сравнить целые таблицы, и схемы гарантированно идентичны, вы можете использовать EXCEPT.

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

UNION ALL

SELECT *, 'Deleted row' FROM @Item
EXCEPT
SELECT * FROM [Table A]
1 голос
/ 01 июня 2011

Ссылка на переменную таблицы аналогична обычной таблице:

SELECT * FROM Table A 
WHERE NOT EXISTS(SELECT * FROM @ITEM WHERE Table A.ID = @ITEM.ID)
1 голос
/ 01 июня 2011

Если вы используете подзапрос, вы можете сделать то же самое

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
0 голосов
/ 01 июня 2011

Вы также должны попробовать ниже, используя Joins .

SELECT * FROM Table A 
Left Join @Item sub on A.ID = sub.ID
Where sub.ID is Null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...