Итерация через TVP перед вставкой записей?

Мне нужна помощь в написании следующего sproc:

У меня есть SQL Server 2008 sproc, который принимает два целочисленных значения (@ID1 и @ID2) и таблицу данных/TVP.

Таблица TVP содержит несколько полей, т.е. Название и описание.

Я хочу выполнить итерацию по таблице TVP и проверить, существует ли заголовок или описание в моей таблице данных, tbl_Items, где @ID1 = tbl_Items.ID1 и @ID2 = tbl_Items.ID2.

Если ни один из них не существует, вставьте значения @ID1 и ID2 и эту строку TVP в tbl_Items.

Спасибо.


person ElHaix    schedule 12.05.2011    source источник


Ответы (2)


Что-то вроде этого?

INSERT INTO tbl_Items (ID1, ID2, Title, Description)
  SELECT
    @ID1, @ID2, TVP.Title, TVP.Description
  FROM
    @TVP AS TVP
  WHERE
    NOT EXISTS (SELECT * FROM tbl_Items AS I WHERE TVP.Title = I.Title AND TVP.Description = I.Description)
person Community    schedule 12.05.2011
comment
Это сработало и было так просто, как я и думал, спасибо. Я боялся, что мне, возможно, придется создать CTE, как указано выше. - person ElHaix; 14.05.2011

Требование кажется несколько неясным, но вы должны иметь возможность использовать MERGE

;WITH Target As
(
SELECT * 
FROM tbl_Items 
WHERE ID1=@ID1 AND ID2=@ID2
)
MERGE 
    INTO Target
    USING @TVP AS Source
    ON Target.Title = Source.Title OR Target.Description = Source.Description
    WHEN NOT MATCHED 
        THEN INSERT  (ID1, ID2, Title, Description) 
              VALUES (@ID1, @ID2, Title, Description)
person Martin Smith    schedule 12.05.2011