Как я могу использовать предложение OUTPUT, чтобы показать, что я только что вставил с помощью SELECT?

#sql-server

#sql-server

Вопрос:

У меня есть эта хранимая процедура, в которой я пытаюсь увидеть, что было только что вставлено в мою таблицу. Сюда также входит поле идентификатора с именем TestID . Я пытаюсь увидеть, что было только что вставлено, но VS2013 показывает мне синтаксическую ошибку еще до запуска хранимой процедуры. Может кто-нибудь указать, что я делаю неправильно?

    INSERT INTO dbo.Test
          ( 
            Title,
            ExamId,
            CreatedBy,
            CreatedDate,
            ParentTestId,
            TopicId           
          )
    SELECT 
            Title,
            @CreatedBy,
            @CreatedDate,
            @TestId,
            TopicId  
    OUTPUT  INSERTED.Title -- Error here <<
    FROM    Test
    WHERE   TestId = @TestId;
  

Я также попытался поместить ВЫВОД после WHERE, но он по-прежнему выдает ошибку «неправильный синтаксис».

Комментарии:

1. Какое сообщение об ошибке вы получаете?

Ответ №1:

OUTPUT Предложение должно быть перед SELECT предложением, например:

 INSERT INTO dbo.Test
      ( 
        Title,
        ExamId,
        CreatedBy,
        CreatedDate,
        ParentTestId,
        TopicId           
      )
OUTPUT  INSERTED.Title INTO #tbl
SELECT 
        Title,
        @CreatedBy,
        @CreatedDate,
        @TestId,
        TopicId      
FROM    Test
WHERE   TestId = @TestId;
  

Обратите внимание на использование OUTPUT...INTO — вам нужно будет сохранить значения из OUTPUT во временной таблице или табличной переменной, чтобы использовать их позже.

РЕДАКТИРОВАТЬ: если вы хотите использовать вместо этого табличную переменную, синтаксис остается прежним. Просто измените временную таблицу ( #tmp ) на табличную переменную @tmp . Табличная переменная может быть объявлена следующим образом:

 declare @tmp table(Title varchar(100))
  

Комментарии:

1. Можете ли вы привести пример того, как я могу сохранить некоторые из этих значений во временной таблице, а затем как я могу сделать так, чтобы SP возвращал эти значения после запуска?

2. Я уже это сделал. #tmp ваша временная таблица будет содержать значения, которые вы хотите включить. В вашей хранимой процедуре вы можете просто добавить a SELECT для извлечения из временной таблицы.

3. Когда я добавил ваш код, он выдает ошибку «SQL71502: неразрешенная ссылка на объект # tbl»

4. Это потому, что я не включил код для создания временной таблицы. Сначала вам нужно будет добавить это. В качестве альтернативы вы можете использовать табличную переменную, которую вам также нужно будет объявить, прежде чем вы сможете использовать OUTPUT...INTO с ней.

5. Как бы я это сделал с табличной переменной?