2017-01-18 12 views
1

Следующий запрос sql является частью запроса, который у меня есть. Идея состоит в том, что в результирующем наборе будет цикл (курсор), вставляющий записи один за другим в другую таблицу. Это динамический sql из-за причин, не полностью известных мне, но с которыми я должен работать. Для ясности я оставил курсор и много столбцов.OUTPUT в динамическом SQL

DECLARE @db_name VARCHAR(500) 
    SET @db_name = '[TESTDB].DBO.[TestTable]' 

    DECLARE @guid UNIQUEIDENTIFIER 
    SET @guid = '15D372FC-63AF-415B-8404-46A15ABE9488' 

    DECLARE @sql NVARCHAR(max) 
    SET @sql = 'INSERT INTO dbo.OtherTable 
       (
        guid, 
        description 
       ) 
       SELECT NEWID(), 
         description 
       FROM ' + @db_name 

    DECLARE @result varchar(max) 
    EXEC sp_executesql @sql, 
    N'OUTPUT', 
    OUTPUT; 

Так идея заключается в том, что записи из результата заявления получает накинуты, и данные из каждой строки вставляются в новую строку в OtherTable. После того, как запись вставлена ​​в OtherTable, уникальный идентификатор, который был сгенерирован с помощью NEWID() (который, разумеется, является руководством, хранящимся в varchar (40)), должен быть захвачен, чтобы он мог быть записан в другой таблице.

Я бы рад, если вам поможет. Спасибо!

+0

«Как только запись вставлена ​​в OtherTable, полученный первичный ключ (который, разумеется, является направляющим, хранящимся в varchar (40)), должен быть записан в другой таблице». Можете ли вы объяснить это немного больше и что вы ожидаете в выходе. @AyatollahOfRockNRolla – Sreemat

+0

Вы посмотрели на триггеры? –

+0

Я бы рекомендовал сделать это сначала без какого-либо динамического SQL, просто чтобы понять, что происходит. Динамический SQL затрудняет составление запросов. Когда вы хорошо понимаете, как это работает в принципе, изучите его преобразование в динамический SQL. –

ответ

0

С вашим редактированием общая настройка становится более понятной. Если я правильно понял, то без какого-либо динамического SQL запрос должен быть простым INSERT с предложением OUTPUT.

INSERT INTO dbo.OtherTable 
(
    guid, 
    description 
) 
OUTPUT inserted.guid AS ID INTO dbo.ThirdTable(ID) 
SELECT 
    NEWID(), 
    description 
FROM dbo.TestTable 
; 

Строки из TestTable вставляются в OtherTable. Значения, генерируемые NEWID, переходят в OtherTable через INSERT и в ThirdTable через OUTPUT.

С динамическим SQL вы просто создаете эту строку, объединяя имя исходной таблицы, а затем запускаете ее простым sp_executesql без каких-либо параметров OUTPUT.

+0

Точно! Хотя у меня есть еще один вопрос, и это касается курсора. Знаете ли вы, что если бы я включил этот запрос в курсор, будет ли он вставлять один указатель за раз? Или он будет проходить через записи и вставлять все это в ThirdTable сразу? – AyatollahOfRockNRolla

+1

Я не понимаю, в чем роль курсора. Пример в моем ответе выбирает все строки из «TestTable» сразу и вставляет все их в «OtherTable» и в «ThirdTable». Если вам не нужны все строки, вы должны добавить предложение WHERE, которое ограничивает строки тем, что вам нужно. Если вы укажете в вопросе код вашего курсора, я могу ответить более конкретно. –

+0

Код, который вы написали, INSERT INTO ... OUTPUT ... SELECT - это то, что должно идти в курсор. Причина в том, что мой коллега хочет вставить все, даже если одна строка дает ошибку. Я предполагаю, что он означает, что он не хочет, чтобы ничто не встало. – AyatollahOfRockNRolla