Выходные столбцы не в таблице назначения? - PullRequest
3 голосов
/ 14 мая 2010

РЕЗЮМЕ:
Мне нужно использовать предложение OUTPUT в операторе INSERT , чтобы вернуть столбцы, которых нет в таблице, в которую я вставляю. Если я могу избежать этого, Я не хочу добавлять столбцы в таблицу, в которую я вставляю .

* ** 1011 1012 * ОПИСАНИЕ:
Моя таблица FinishedDocument имеет только один столбец. Это таблица, в которую я вставляю.

FinishedDocument
- DocumentID

Моя таблица документов состоит из двух столбцов. Это таблица, из которой мне нужно вернуть данные.

* * Документ тысячу двадцать-один
- DocumentID
- Описание

Следующее вставляет одну строку в FinishedDocument. Его предложение OUTPUT возвращает вставленный DocumentID. Это работает, но не дает описание вставленного документа.

INSERT INTO FinishedDocument
OUTPUT INSERTED.DocumentID
SELECT DocumentID
FROM Document
WHERE DocumentID = @DocumentID

Мне нужно вернуть из таблицы документов и DocumentID, и описание соответствующего документа из INSERT.

Какой синтаксис мне нужен для этого? Я думаю, что это возможно только с одним оператором INSERT, изменяя предложение OUTPUT (таким образом, я явно не понимаю)?

Есть ли более умный путь, который не похож на путь, по которому я иду?

РЕДАКТИРОВАТЬ: SQL Server 2005

Ответы [ 6 ]

2 голосов
/ 14 мая 2010

Посмотрите на Пример A :

DECLARE @temp TABLE (DocumentID int)

INSERT INTO FinishedDocument 
    OUTPUT INSERTED.DocumentID 
    INTO @temp
SELECT DocumentID 
FROM Document 
WHERE DocumentID = @DocumentID 

SELECT Document.DocumentId, Document.Description
FROM @temp AS t
INNER JOIN Document 
    ON t.DocumentID = Document.DocumentID
1 голос
/ 14 мая 2010

Предложение OUTPUT может содержать любые поля, с которыми оно работает, например, в вашем случае: любое из полей, в которые вы вставляете данные. Это означает: любой столбец из таблицы FinishedDocument.

Однако предложение OUTPUT не может объединять или извлекать данные из других таблиц.

1 голос
/ 14 мая 2010

Интересно, можете ли вы замаскировать его вот так (должно ли меня беспокоить, что я действительно подумал бы сделать это таким образом?):

;WITH r (DocumentID)
     AS (INSERT INTO FinishedDocument
         OUTPUT INSERTED.DocumentID
         SELECT DocumentID
           FROM Document
          WHERE DocumentID = @DocumentID)
 SELECT d.DocumentID, d.DocumentName
   FROM Document d
   JOIN r
     ON d.DocumentID = r.DocumentID

Ваша вставка все еще использует предложение OUTPUT, но каквстроенная таблица, которая затем связывается с документом, чтобы получить необходимую информацию.Хотя по какой-то причине я не могу избежать ощущения, что это безнадежно губит предложение WITH ...

0 голосов
/ 14 мая 2010

Как насчет этого?

create table FinishedDocument (
    DocumentId int
)

create table Document (
    DocumentId int,
    Description nvarchar(100)
)

create table #tmpDoc (
    DocumentId int
)

insert into Document
    (DocumentId, Description)
    values
    (1, 'Test')

insert into FinishedDocument
    (DocumentId)
    output Inserted.DocumentId into #tmpDoc 
    select D.DocumentId
        from Document D
        where D.DocumentId = 1

select D.DocumentId, D.Description
    from #tmpDoc t
        inner join Document D
            on t.DocumentId = D.DocumentId

drop table #tmpDoc      
drop table FinishedDocument
drop table Document
0 голосов
/ 14 мая 2010

В 2008 году вы можете сделать это с помощью оператора MERGE. Может быть, вы могли бы рассмотреть вопрос об обновлении:)

MERGE INTO FinishedDocument
USING Document d ON 1=0
WHEN NOT MATCHED AND d.DocumentID = @DocumentID THEN
INSERT (DocumentID) VALUES (@DocumentID)
OUTPUT d.DocumentID, d.Description;

Я предлагаю вам проверить план выполнения, прежде чем попробовать это.

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

0 голосов
/ 14 мая 2010

Оберните вставку в CTE, затем при выборе соедините вывод обратно с таблицей документов.

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