SQL Server, как удалить элементы обновлений из определяемого пользователем типа таблицы?

У меня есть пользовательский тип таблицы, скажем, @TT dbo.IntType readonly, IntType представляет собой пакет int, как первичный ключ

CREATE TYPE [dbo].[IntType] AS TABLE(
    [T] [int] NOT NULL,
    PRIMARY KEY CLUSTERED 

Мне нравится делать UPDATE на основе всех ключей (int) в IntType и INSERT новых строк для ключа (int), не существующих в базе данных (upsert)

Интересно, есть ли простой способ удалить ключ «ОБНОВЛЕНО» (int)? Тогда я могу вставить остальные. (или если у вас есть супер однострочный upsert для SQL Server 2010!!!)


person Eric Yin    schedule 20.03.2012    source источник


Ответы (1)


Используйте оператор MERGE.

http://technet.microsoft.com/en-us/library/bb510625.aspx

Посмотрим, смогу ли я что-нибудь собрать.

РЕДАКТИРОВАТЬ: пример

MERGE INTO [TargetTable] AS T
USING (SELECT l.T AS 'id' FROM @list l ) AS S
ON (T.[id] = S.[id])
WHEN MATCHED THEN
    UPDATE SET
        T.updated = 1
WHEN NOT MATCHED THEN
    INSERT VALUES ([insert value into each column of target table]);

РЕДАКТИРОВАТЬ 2: параметр @list - это список, который передается в том, что вы заполнили идентификаторами

person spinon    schedule 20.03.2012
comment
святая корова, это было легко, я не могу дождаться, чтобы попробовать это - person Eric Yin; 20.03.2012
comment
Это действительно хорошо, но это работает только на 2008 и выше. Поскольку вы используете 2010, я подумал, что у вас все будет хорошо. - person spinon; 20.03.2012
comment
Работает как шарм, быстро и надежно. Работало как на моем локальном SQL Server 2008 R2, так и на SQL Azure. Что касается SQL 2010, то по моей вине у M$ слишком много продуктов, и я запутался. - person Eric Yin; 20.03.2012
comment
Я тоже не был уверен, что это такое. Я подумал, что это новая версия после 2008 R2, но понял, что не всегда успеваю за последними версиями. - person spinon; 20.03.2012