2015-07-18 3 views
2

Мне нужна хранимая процедура, которая возвращает набор идентификаторов для созданных записей. Я уже прочитал, что SCOPE_IDENTITY дает только последний идентификатор. но моего умения SQL недостаточно для решения этого конкретного случая и получения всех идентификаторов в качестве вывода.Сбор идентификаторов ВСЕХ вставленных записей в качестве результата

вот что у меня есть сейчас - это только получает идентификатор последней записи в

USE AdventureWorks2008; 
DELETE FROM [HumanResources].[Shift] where [HumanResources].[Shift].Name='c' or [HumanResources].[Shift].Name='d' 
IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'ShiftUpdateXml') 
DROP PROCEDURE ShiftUpdateXml 
GO 


CREATE PROCEDURE ShiftUpdateXml 
@strXML XML, @ShiftID [tinyint] = NULL OUTPUT 
AS 
BEGIN 
    SET NOCOUNT ON; 


    INSERT [HumanResources].[Shift](Name,StartTime,EndTime) SELECT 
    TEMP.Name,TEMP.StartTime,TEMP.EndTime 
     FROM (SELECT 
    assignreassignro.value('Name[1]','nvarchar(50)') AS Name, 
    assignreassignro.value('StartTime[1]','time(7)') AS StartTime, 
    assignreassignro.value('EndTime[1]','time(7)') AS EndTime 

    FROM @strXML.nodes('documentelement/assignreassignro')Documentelement(assignreassignro)) AS TEMP 

    SET @ShiftID = SCOPE_IDENTITY(); 
END 
GO 

DECLARE @ShiftID INT; 
DECLARE @XmlVal XML= '<?xml version="1.0"?> 
<documentelement> 
    <assignreassignro> 
    <Name>c</Name> 
    <StartTime>10:30:00.0000000</StartTime> 
    <EndTime>17:30:00.0000000</EndTime> 
    </assignreassignro> 
    <assignreassignro> 
    <Name>d</Name> 
    <StartTime>11:00:00.0000000</StartTime> 
    <EndTime>18:00:00.0000000</EndTime> 
    </assignreassignro> 
</documentelement>' 

EXEC ShiftUpdateXml @XmlVal,@ShiftID = @ShiftID OUTPUT; 
PRINT @ShiftID; 

ответ

3

Вы ищете статьи output. Если вы просто хотите, идентификаторы, вы можете сделать:

DECLARE @ids TABLE (id int); 

INSERT [HumanResources].[Shift](Name,StartTime,EndTime) 
    OUTPUT inserted.Id INTO @ids 
    SELECT assignreassignro.value('Name[1]', 'nvarchar(50)') AS Name, 
      assignreassignro.value('StartTime[1]', 'time(7)') AS StartTime, 
      assignreassignro.value('EndTime[1]', 'time(7)') AS EndTime 
    FROM @strXML.nodes('documentelement/assignreassignro') Documentelement(assignreassignro); 

Если вы хотите дополнительных значений, вы можете добавить их к столу и INSERT заявления.

Также обратите внимание, что вам не нужен подзапрос для SELECT.

1

Чтобы получить несколько строк вы должны использовать выход из таблицы, вставленной с чем-то вроде этого:

CREATE PROCEDURE ShiftUpdateXml 
@strXML XML 
AS 
BEGIN 
    INSERT [Shift](Name,StartTime,EndTime) 
    output inserted.id 
    SELECT 
    TEMP.Name,TEMP.StartTime,TEMP.EndTime 
     FROM (SELECT 
    assignreassignro.value('Name[1]','nvarchar(50)') AS Name, 
    assignreassignro.value('StartTime[1]','time(7)') AS StartTime, 
    assignreassignro.value('EndTime[1]','time(7)') AS EndTime 

    FROM @strXML.nodes('documentelement/assignreassignro')Documentelement(assignreassignro)) AS TEMP 
END 

Таким образом, процедура возвращает список идентификаторов. Я привел пример в SQL Fiddle

Смежные вопросы