Оператор INSERT не позволит мне использовать ЕСЛИ НЕ СУЩЕСТВУЕТ - PullRequest
1 голос
/ 01 октября 2011

У меня есть оператор вставки, который я не могу получить так, как я хочу. Это на странице vb.net. Это на странице VB.net, и я использую SQL Server 2005 для своей базы данных.

Dim strSQL As String = "IF NOT EXISTS
(SELECT Title From Picklist) 
BEGIN INSERT INTO Picklist (Title, Data) 
VALUES (@Title, @Data);

INSERT INTO Marketing 
(ProductID, MarketingTypeID, MarketingTitle, MarketingData) 
VALUES (@ProductID, 9, 'Video', scope_identity()) END"

Я не получаю сообщение об ошибке, и в базу данных ничего не вставляется. Если я попытаюсь поставить END в конце первого оператора INSERT, то получаю сообщение об ошибке, говорящее, что MarketingData имеет значение NULL и не может быть вставлен.

Но если я вычеркну, ЕСЛИ НЕ СУЩЕСТВУЕТ из утверждения, все вставляется отлично. Что я тут не так делаю?

ОБНОВЛЕНИЕ: Правильно ли писать подобное утверждение?

INSERT INTO Marketing
SELECT (@ProductID, @MarketingTypeID, @MarketingTitle, @MarketingData)
WHERE NOT EXISTS
(SELECT * FROM Marketing)

1 Ответ

4 голосов
/ 01 октября 2011

Ваш IF NOT EXISTS(SELECT * FROM Picklist) пропустит вставку, если в Picklist вообще есть какие-либо строки.

Из вашего описания того, что происходит при изменении позиции END, кажется, что в таблице есть строки.

Я предполагаю, что на самом деле вы пытаетесь сделать UPSERT,На какой версии SQL Server вы работаете?Если в 2008 году заглянуть в MERGE

;WITH Source(Title, Data) AS
(
SELECT @Title, @Data
)
MERGE Picklist AS T
USING Source S
ON (T.Title = S.Title)


WHEN NOT MATCHED BY TARGET THEN
    INSERT (Title, Data)
    VALUES (@Title, @Data)
    ;

IF (@@ROWCOUNT <> 0)
INSERT INTO Marketing 
            (ProductID, MarketingTypeID, MarketingTitle, MarketingData) 
     VALUES (@ProductID, 9, 'Video', scope_identity())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...