2017-02-11 2 views
1

У меня этот SQL-запрос, который работает нормально.
Он возвращает полную вставленную строку.SQL SERVER - Возврат OUTPUT INSERTED. * С JOIN?

INSERT INTO Comments 
    (
    ImageID, 
    UserId1, 
    CommentTxt 
) OUTPUT INSERTED.* 

SELECT 1620, 
     @userid1, 
     'abc' 

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

Так что я попытался это:

INSERT INTO Comments 
    (
    ImageID, 
    UserId1, 
    CommentTxt 
)OUTPUT INSERTED.* JOIN Users u ON INSERTED.userid1 = u.UserID 
SELECT 1620, 
     @userid1, 
     'abc' 

Результата :

Msg 156, Level 15, Состояние 1, строка 13 Неправильный синтаксис рядом с ключевым словом «ПРИСОЕДИНЯЙТЕСЬ».

Вопрос:

Можно ли использовать OUTPUT с JOIN?

В основном я после: Inserted.*,relevant_user.* В том же хит.

- NB
Я не хотите получить SCOPE_IDENTITY и повторно выбрать таблицу.

ответ

3

Если в Users есть точно одна соответствующая строка, вы можете использовать MERGE.

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

WITH Source 
    AS (SELECT * 
     FROM (VALUES(1620, @userid1, 'abc')) 
        V(ImageID, UserId1, CommentTxt) 
       JOIN Users u 
        ON v.userid1 = u.UserID) 
MERGE INTO Comments 
USING Source 
ON 1 = 0 
WHEN NOT MATCHED THEN 
    INSERT (ImageID, 
      UserId1, 
      CommentTxt) 
    VALUES (ImageID, 
      UserId1, 
      CommentTxt) 
OUTPUT Source.*; 
+0

Да, конкретный комментарий может быть написан только 1 пользователем. BTW - спасибо :) –

+0

Не могли бы вы объяснить это? 'ON 1 = 0'? –

+0

Это всегда неверно, поэтому всегда идет 'NOT MATCHED' –