es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Importar desde xml a columna de identidad

Intenté importar algunos datos de XML a una tabla temporal.

Mi código:

DECLARE @xmlData XML

SET @xmlData = '
<PersonsInfo>
  <Person BussEntityId="1">
    <Name>
      <First>Ken</First>
      <Middle>J</Middle>
      <Last>Sánchez</Last>
    </Name>
  </Person>
  <Person BussEntityId="2">
    <Name>
      <First>Terri</First>
      <Middle>Lee</Middle>
      <Last>Duffy</Last>
    </Name>
  </Person>
</PersonsInfo>'

CREATE TABLE #Person 
(
    PersonId int IDENTITY PRIMARY KEY,
    FirstName varchar(20),
    MiddleName varchar(20),
    LastName varchar(20)
)

SET IDENTITY_INSERT #Person ON;

INSERT INTO #Person
    SELECT
        T.e.value('(@BussEntityId)[1]', 'int') AS PersonId,
        P.elem.value('First[1]', 'varchar(20)') AS FirstName,
        P.elem.value('Middle[1]', 'varchar(20)') AS MiddleName,
        P.elem.value('Last[1]', 'varchar(20)') AS LastName
    FROM 
        @xmlData.nodes('/PersonsInfo/Person') AS T(e)
    OUTER APPLY 
        T.e.nodes('Name') AS P(elem)

SET IDENTITY_INSERT #Person OFF

SELECT * FROM #Person

DROP TABLE #Person

Me sale un error:

Un valor explícito para la columna de identidad en la tabla ‘#Person’ solo se puede especificar cuando se utiliza una lista de columnas y IDENTITY_INSERT está ON.

Establecí IDENTITY_INSERT en ON, ¿por qué hay un problema?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema es que IDENTITY_INSERT permite insertar valores explícitos en una columna de identidad. Sin embargo, en el código proporcionado no se especifica una lista de columnas explícita en la declaración INSERT, lo que provoca que se produzca el error.

    Para solucionar el error, la lista de columnas debe especificarse explícitamente, así:

    SET IDENTITY_INSERT #Person ON;
    
    INSERT INTO #Person (PersonId, FirstName, MiddleName, LastName)
        SELECT
            T.e.value('@BussEntityId', 'int') AS PersonId,
            P.elem.value('First[1]', 'varchar(20)') AS FirstName,
            P.elem.value('Middle[1]', 'varchar(20)') AS MiddleName,
            P.elem.value('Last[1]', 'varchar(20)') AS LastName
        FROM 
            @xmlData.nodes('/PersonsInfo/Person') AS T(e)
            OUTER APPLY T.e.nodes('Name') AS P(elem);
    
    SET IDENTITY_INSERT #Person OFF;
    

    Al especificar explícitamente la lista de columnas, SQL Server sabe que los valores proporcionados en la declaración SELECT son solo para las columnas correspondientes. Por lo tanto, permite que IDENTITY_INSERT funcione según lo previsto.

Comments are closed.