Сравнение данных с T-SQL в запросе в SQL Server 2005 - PullRequest
2 голосов
/ 26 февраля 2010

Мне было интересно, если кто-нибудь знает простой способ сделать это.

У меня есть пара таблиц с данными, эти данные являются "статическими", так что пользователи не изменяют их, это толькоменя, который получает, чтобы вставить / обновить строки.И мне интересно, есть ли простой способ вставить строки, которые не существуют, и обновить строки, которые отличаются.

Способ, который я рассчитал, будет работать так:

IF((SELECT COUNT(*) FROM myTable WHERE myId = x) = 0)
   INSERT myTable() values()
ELSE
   UPDATE myTable SET data = updatedData WHERE myId = 0

Но так как у меня достаточно много строк, которые я хочу обновить, мне интересно, есть ли более простой способ сделать это.В базе данных VS есть средство сравнения данных, возможно ли его использовать каким-либо образом из сценария запроса или другим способом?Я хочу, чтобы эти обновления выполнялись при развертывании проекта базы данных с VS.

Ответы [ 3 ]

1 голос
/ 26 февраля 2010

Вы можете легко удалить оператор if, например:

insert into myTable
select
   <values>
where
   not exists(select * from myTable where myId = @x)

Затем вы можете проверить значение @@rowcount. Если он не равен нулю, вы можете выйти из этого раздела логики, зная, что запись была введена в базу данных.

Если @@rowcount равно нулю, это означает, что запись с этим идентификатором существует в базе данных, и вы можете выпустить обновление:

update 
    myTable 
set 
    <values>
where 
    myId = @x

Обратите внимание, что вы хотите убедиться, что это выполняется внутри транзакции, так как могут возникнуть условия гонки, если вы пытаетесь обновить этот код от двух отдельных клиентов.

1 голос
/ 26 февраля 2010

В базе данных можно создать триггер, который автоматически обновляет / вставляет строки.

0 голосов
/ 26 февраля 2010

Что вам нужно, так это команда MERGE для SQL Server 2008. Вот страница документации MS http://technet.microsoft.com/en-us/library/bb510625.aspx.

Отрывок:

MERGE INTO dbo.myTable AS Target
USING (VALUES   ('something 1','other 1'), 
                ('something 2', 'other 2'), 
                ('something 3', 'other 3'))
       AS Source (Field1, Field2)
ON Target.myId = Source.myId
WHEN MATCHED THEN
    UPDATE SET Field1 = Source.Field1,
               Field2 = Source.Field2
WHEN NOT MATCHED BY TARGET THEN
    INSERT (Field1, Field2) 
    VALUES (Field1, Field2)

Я полагаю, по тегу SQL2005, что это не очень вам поможет (извините!), Поэтому ответ casperOne, вероятно, наиболее подходящий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...