Problema con la importacion de archivo y tabla temporal con key

06/05/2005 - 15:37 por Nicola Strappazzon | Informe spam
Hola de nuevo muchachos, estoy tratando de poder importar un archivo a una
tabla con primary key, pero al hacerlo me da un error, le quito el primary
key y funciona perfectamente, el caso es q tengo que después recorrer esa
tabla y necesito usar el primary key para poder hacerlo, ya que en el
archivo q estoy importando existe un primary key pero no continuo, que es la
Cedula de Identidad, como un numero de identificación en Venezuela, y no
puedo hacer un contador con eso por q no es un numero continuo y seria MUYYY
LAAARRRGGGOOOOO recorrerlo. Por eso el poner mi idea el PK en la tabla
temporal, alguna sugerencia es bienvenida!



Gracias.

Preguntas similare

Leer las respuestas

#11 Alejandro Mesa
07/05/2005 - 03:01 | Informe spam
Nicola,

Decididamente que cuando uno puede ver el codigo se tiene una mejor idea de
lo que esta pasando. Vamos por paso:

Ok. use el metodo 2, el llena la tabla perfectamente, le coloca la columna
con clave primaria y funciona bien, pero cuando mando hacer una busqueda con
el where no me reconose la columna con la clave primaria



Eso se debe a que declarastes la variable @Vueltas pero no la inicializastes
en ningun momento por lo que su valor es NULL y ya tu sabes que no podemos
usar operadores de igualdad con valores NULL, asi que la sentencia:

SET @Cedula = (SELECT FK_Estudiante FROM #tbl_TempFile WHERE PK_Line > @Vueltas)



no seleccionara nada pues PK_Line = @Vueltas no se cumplicara. Tampoco se
estava incrementando la variable en la expresion:

set @vueltas = @vueltas + 1

porque NULL mas cualquier valor es NULL.

Otra cosa, en una sentencia select se pouede asignar mas de una variable,
asi que en vez de tener cinco sentencias select para asignar valor a cada una
de tus variables, puedes usar una sola sentencia donde se le asigna el valor
de la columna correspondiente a cada variable:

SELECT
@Cedula = FK_Estudiante,
@Cod_Materia = CodMateria,
@Periodo = FK_Periodo,
@Calificacion = Calificacion,
@Estado = ESTADO
FROM #tbl_TempFile
WHERE PK_Line = @Vueltas

Ahora biene el ultimo punto. De la forma que lo haces, es igual que si
estuvieses usando cursores, pues a la final recorres la tabla fila a fila y
en 500,000 filas esto te tomara bastante tiempo. Lo que queda por saber ahora
es lo que hace el procedimiento SP_IMPORTAR_Calificaciones, el cual se debe
adaptar para manipular la tabla temporal como un conjunbto y no fila a fila.
Aca te pongo el script con los arreglos necesarios para que corra, solo falta
que nos dejes saber lo que hace el procedimiento para cambiarlo y buscar una
solucion de conjunto.


SET NOCOUNT ON

DECLARE @Vueltas INT
DECLARE @Cedula INT
DECLARE @Cod_Materia VARCHAR(8)
DECLARE @Periodo INT
DECLARE @Calificacion TINYINT
DECLARE @Estado TINYINT
declare @i int

CREATE TABLE #tbl_TempFile(
FK_Estudiante INT NOT NULL,
CodMateria VARCHAR(8) NOT NULL,
FK_Periodo INT NOT NULL,
Calificacion TINYINT NOT NULL,
ESTADO TINYINT NOT NULL
)

BULK INSERT #tbl_TempFile
FROM 'D:\My Documents\Visual Studio Projects\Applications\SAVA2.0\Datos de
prueba\Archivos a Importar\Record Academico.TXT'
WITH(
FIELDTERMINATOR = '|',
ROWTERMINATOR = ''
)

ALTER TABLE #tbl_TempFile
ADD PK_Line INT IDENTITY (1, 1) NOT FOR REPLICATION NOT NULL PRIMARY KEY

set @vueltas = 1
set @i = (SELECT COUNT(*) FROM #tbl_TempFile)

WHILE(@Vueltas <= @i)
BEGIN
SELECT
@Cedula = FK_Estudiante,
@Cod_Materia = CodMateria,
@Periodo = FK_Periodo,
@Calificacion = Calificacion,
@Estado = ESTADO
FROM #tbl_TempFile
WHERE PK_Line = @Vueltas

EXEC SP_IMPORTAR_Calificaciones @Cedula, @Periodo, @Cod_Materia,
@Calificacion, @Estado
SET @Vueltas = @Vueltas + 1
END

DROP TABLE #tbl_TempFile
go


AMB

"Nicola Strappazzon" wrote:

Ok. use el metodo 2, el llena la tabla perfectamente, le coloca la columna
con clave primaria y funciona bien, pero cuando mando hacer una busqueda con
el where no me reconose la columna con la clave primaria, Recuerda que estoy
tratando de poder migrar los 500.000 mil registros usando conjuntos y no
cursores como me hablaron aller.

Te muestro el codigo:

SET NOCOUNT ON

DECLARE @Vueltas INT
DECLARE @Cedula INT
DECLARE @Cod_Materia VARCHAR(8)
DECLARE @Periodo INT
DECLARE @Calificacion TINYINT
DECLARE @Estado TINYINT

CREATE TABLE #tbl_TempFile(
FK_Estudiante INT NOT NULL,
CodMateria VARCHAR(8) NOT NULL,
FK_Periodo INT NOT NULL,
Calificacion TINYINT NOT NULL,
ESTADO TINYINT NOT NULL)

BULK INSERT #tbl_TempFile
FROM 'D:\My Documents\Visual Studio Projects\Applications\SAVA2.0\Datos de
prueba\Archivos a Importar\Record Academico.TXT'
WITH(
FIELDTERMINATOR = '|',
ROWTERMINATOR = ''
)

ALTER TABLE #tbl_TempFile
ADD PK_Line INT IDENTITY (1, 1) NOT FOR REPLICATION NOT NULL PRIMARY KEY

PK_Line FROM #tbl_TempFile

WHILE(@Vueltas <= (SELECT COUNT(*) FROM #tbl_TempFile))
BEGIN
SET @Cedula = (SELECT FK_Estudiante FROM #tbl_TempFile WHERE PK_Line =
@Vueltas)
SET @Cod_Materia = (SELECT CodMateria FROM #tbl_TempFile WHERE PK_Line =
@Vueltas)
SET @Periodo = (SELECT FK_Periodo FROM #tbl_TempFile WHERE PK_Line =
@Vueltas)
SET @Calificacion = (SELECT Calificacion FROM #tbl_TempFile WHERE PK_Line =
@Vueltas)
SET @Estado = (SELECT ESTADO FROM #tbl_TempFile WHERE PK_Line = @Vueltas)

EXEC SP_IMPORTAR_Calificaciones @Cedula, @Periodo, @Cod_Materia,
@Calificacion, @Estado
SET @Vueltas = @Vueltas + 1
END

DROP TABLE #tbl_TempFile

"Alejandro Mesa" wrote in message
news:
> Nicola,
>
> No entiendo que pasa. Cual metodo escogistes?. Si escogistes el segundo,
> entonces recuerda crear la tabla temporal sin la columna identity, y
> adicionarla despues de que la sentencia bulk insert haya terminado. Fijate
> que en el ejemplo esta comentada la columna.
>
>> > CREATE TABLE #tbl_TempFile(
> ...
>
>
> AMB
>
>
> "Nicola Strappazzon" wrote:
>
>> estaba probando tu metodo, pero no me funciona muy bien por que me dice
>> error al no conseguir la columna PK_Line, y me parece extraño, por q hago
>> un
>> select * from tabla, y si me muestra la columnas con sus respectivos ID,
>> pero hago un select buscando algo en esa columna en especifivo y nada...
>> me
>> da el error q te mencione :S
>>
>> "Alejandro Mesa" wrote in
>> message
>> news:
>> > Nicola,
>> >
>> > El problema se debe a que el archivo de entrada no tiene los valores de
>> > la
>> > columna identity. En este caso debes crear un archivo con la
>> > especificacion
>> > del formato de la data contenida por tu archivo de entrada (exactamente
>> > igual
>> > que cuando usas BCP) y usar la opcion FORMATFILE [ =
>> > 'format_file_path' ]
>> > de
>> > la sentencia BULK INSERT. La otra opcion es crear la columna identity
>> > despues
>> > que hayas importado la data. Esta ultima opcion te dara mejor
>> > rendimiento
>> > puesto que mientras menos indices tengas, mas rapido sera el proceso de
>> > importacion.
>> >
>> >
>> > CREATE TABLE #tbl_TempFile(
>> > KEY,
>> > FK_Estudiante INT NOT NULL,
>> > CodMateria VARCHAR(8) NOT NULL,
>> > FK_Periodo INT NOT NULL,
>> > Calificacion TINYINT NOT NULL,
>> > ESTADO TINYINT NOT NULL
>> > )
>> >
>> > BULK INSERT #tbl_TempFile
>> > FROM 'D:\My Documents\Visual Studio Projects\Applications\SAVA2.0\Datos
>> > de
>> > prueba\Record Academico.TXT'
>> > WITH(
>> > FIELDTERMINATOR = '|',
>> > ROWTERMINATOR = ''
>> > )
>> >
>> > alter table #tbl_TempFile
>> > add PK_Line INT IDENTITY (1, 1) NOT NULL constraint pk_#tbl_TempFile
>> > primary
>> > key
>> >
>> >
>> > AMB
>> >
>> >
>> > "Nicola Strappazzon" wrote:
>> >
>> >> Ok. te pongo todos los datos.
>> >>
>> >> el formato del archivo es asi: 500 mil de esos registros hay en el
>> >> archivo
>> >> plano
>> >>
>> >> 11992015|06100102|67|11|6
>> >> 11992015|06100101|67|16|6
>> >> 11992015|06100103|67|14|6
>> >> 11992015|06100108|68|13|6
>> >> 11992015|06100206|68|14|6
>> >> 11992015|06100205|68|13|6
>> >> 11992015|06100201|68|15|6
>> >> 11992015|06100207|68|13|6
>> >> 11992015|06100203|68|14|6
>> >>
>> >> creo una tabla temporal para guardar esos datos.
>> >>
>> >> CREATE TABLE #tbl_TempFile(
>> >> PK_Line INT IDENTITY (1, 1) NOT FOR REPLICATION NOT NULL PRIMARY
>> >> KEY,
>> >> FK_Estudiante INT NOT NULL,
>> >> CodMateria VARCHAR(8) NOT NULL,
>> >> FK_Periodo INT NOT NULL,
>> >> Calificacion TINYINT NOT NULL,
>> >> ESTADO TINYINT NOT NULL
>> >> )
>> >>
>> >> despues executo la inscruccion para ver importar los datos.
>> >>
>> >> BULK INSERT #tbl_TempFile
>> >> FROM 'D:\My Documents\Visual Studio
>> >> Projects\Applications\SAVA2.0\Datos
>> >> de
>> >> prueba\Record Academico.TXT'
>> >> WITH(
>> >> FIELDTERMINATOR = '|',
>> >> ROWTERMINATOR = ''
>> >> )
>> >>
>> >> Y despues suelta el siguiente error:
>> >>
>> >> Server: Msg 4864, Level 16, State 1, Line 1
>> >> Bulk insert data conversion error (type mismatch) for row 1, column 5
>> >> (Calificacion).
>> >> Server: Msg 4864, Level 16, State 1, Line 1
>> >> Bulk insert data conversion error (type mismatch) for row 2, column 5
>> >> (Calificacion).
>> >> Server: Msg 4864, Level 16, State 1, Line 1
>> >> Bulk insert data conversion error (type mismatch) for row 3, column 5
>> >> (Calificacion).
>> >> Server: Msg 4864, Level 16, State 1, Line 1
>> >> Bulk insert data conversion error (type mismatch) for row 4, column 5
>> >> (Calificacion).
>> >> Server: Msg 4864, Level 16, State 1, Line 1
>> >> Bulk insert data conversion error (type mismatch) for row 5, column 5
>> >> (Calificacion).
>> >> Server: Msg 4864, Level 16, State 1, Line 1
>> >> Bulk insert data conversion error (type mismatch) for row 6, column 5
>> >> (Calificacion).
>> >> Server: Msg 4864, Level 16, State 1, Line 1
>> >> Bulk insert data conversion error (type mismatch) for row 7, column 5
>> >> (Calificacion).
>> >> Server: Msg 4864, Level 16, State 1, Line 1
>> >> Bulk insert data conversion error (type mismatch) for row 8, column 5
>> >> (Calificacion).
>> >> Server: Msg 4864, Level 16, State 1, Line 1
>> >> Bulk insert data conversion error (type mismatch) for row 9, column 5
>> >> (Calificacion).
>> >> Server: Msg 4864, Level 16, State 1, Line 1
>> >> Bulk insert data conversion error (type mismatch) for row 10, column 5
>> >> (Calificacion).
>> >> Server: Msg 4864, Level 16, State 1, Line 1
>> >> Bulk insert data conversion error (type mismatch) for row 11, column 5
>> >> (Calificacion).
>> >> Server: Msg 4865, Level 16, State 1, Line 1
>> >> Could not bulk insert because the maximum number of errors (10) was
>> >> exceeded.
>> >> Server: Msg 7399, Level 16, State 1, Line 1
>> >> OLE DB provider 'STREAM' reported an error. The provider did not give
>> >> any
>> >> information about the error.
>> >> OLE DB error trace [OLE/DB Provider 'STREAM' IRowset::GetNextRows
>> >> returned
>> >> 0x80004005: The provider did not give any information about the
>> >> error.].
>> >> The statement has been terminated.
>> >>
>> >> y alli me quede... no consigo info en internet:S
>> >>
>> >> "Alejandro Mesa" wrote in
>> >> message
>> >> news:
>> >> >
>> >> > Nicola,
>> >> >
>> >> > Vamos por parte, ok?
>> >> >
>> >> >> Hola de nuevo muchachos, estoy tratando de poder importar un
>> >> >> archivo a
>> >> >> una
>> >> >> tabla con primary key, pero al hacerlo me da un error
>> >> >
>> >> > Cual es el error que te da?
>> >> >
>> >> >> tabla con primary key, pero al hacerlo me da un error, le quito el
>> >> >> primary
>> >> >> key y funciona perfectamente, el caso es q tengo que después
>> >> >> recorrer
>> >> >> esa
>> >> >> tabla y necesito usar el primary key para poder hacerlo, ya que en
>> >> >> el
>> >> >> archivo q estoy importando existe un primary key pero no continuo,
>> >> >
>> >> > Cual es la definicion de la tabla?. Danos un poco de informacion
>> >> > sobre
>> >> > esa
>> >> > primary key.
>> >> >
>> >> > Por que necesitas que el pk sea consecutivo?
>> >> >
>> >> > AMB
>> >> >
>> >> > "Nicola Strappazzon" wrote:
>> >> >
>> >> >> Hola de nuevo muchachos, estoy tratando de poder importar un
>> >> >> archivo a
>> >> >> una
>> >> >> tabla con primary key, pero al hacerlo me da un error, le quito el
>> >> >> primary
>> >> >> key y funciona perfectamente, el caso es q tengo que después
>> >> >> recorrer
>> >> >> esa
>> >> >> tabla y necesito usar el primary key para poder hacerlo, ya que en
>> >> >> el
>> >> >> archivo q estoy importando existe un primary key pero no continuo,
>> >> >> que
>> >> >> es
>> >> >> la
>> >> >> Cedula de Identidad, como un numero de identificación en Venezuela,
>> >> >> y
>> >> >> no
>> >> >> puedo hacer un contador con eso por q no es un numero continuo y
>> >> >> seria
>> >> >> MUYYY
>> >> >> LAAARRRGGGOOOOO recorrerlo. Por eso el poner mi idea el PK en la
>> >> >> tabla
>> >> >> temporal, alguna sugerencia es bienvenida!
>> >> >>
>> >> >>
>> >> >>
>> >> >> Gracias.
>> >> >>
>> >> >>
>> >> >>
>> >>
>> >>
>> >>
>>
>>
>>



Respuesta Responder a este mensaje
#12 Nicola Strappazzon
07/05/2005 - 20:08 | Informe spam
Hola, caramba jejejjejeej, de verdad q gracias por la paciencia y la
dedicación, yo te mando el SP_IMPORTAR_Calificaciones el lunes por que no me
lleve los codigos fuentes, estan en la pc de trabajo de la universidad, por
cierto todo esto es para hacer un sistema de inscripcion via internet y
pasar todo de un sistema viejo de natural/adabas a sql server y asp.net,
entonces nos encontramos en el foro el lunes :D. buen fin de semana.

"Nicola Strappazzon" wrote in message
news:
Ok. use el metodo 2, el llena la tabla perfectamente, le coloca la columna
con clave primaria y funciona bien, pero cuando mando hacer una busqueda
con el where no me reconose la columna con la clave primaria, Recuerda que
estoy tratando de poder migrar los 500.000 mil registros usando conjuntos
y no cursores como me hablaron aller.

Te muestro el codigo:

SET NOCOUNT ON

DECLARE @Vueltas INT
DECLARE @Cedula INT
DECLARE @Cod_Materia VARCHAR(8)
DECLARE @Periodo INT
DECLARE @Calificacion TINYINT
DECLARE @Estado TINYINT

CREATE TABLE #tbl_TempFile(
FK_Estudiante INT NOT NULL,
CodMateria VARCHAR(8) NOT NULL,
FK_Periodo INT NOT NULL,
Calificacion TINYINT NOT NULL,
ESTADO TINYINT NOT NULL)

BULK INSERT #tbl_TempFile
FROM 'D:\My Documents\Visual Studio Projects\Applications\SAVA2.0\Datos de
prueba\Archivos a Importar\Record Academico.TXT'
WITH(
FIELDTERMINATOR = '|',
ROWTERMINATOR = ''
)

ALTER TABLE #tbl_TempFile
ADD PK_Line INT IDENTITY (1, 1) NOT FOR REPLICATION NOT NULL PRIMARY KEY

PK_Line FROM #tbl_TempFile

WHILE(@Vueltas <= (SELECT COUNT(*) FROM #tbl_TempFile))
BEGIN
SET @Cedula = (SELECT FK_Estudiante FROM #tbl_TempFile WHERE PK_Line =
@Vueltas)
SET @Cod_Materia = (SELECT CodMateria FROM #tbl_TempFile WHERE PK_Line =
@Vueltas)
SET @Periodo = (SELECT FK_Periodo FROM #tbl_TempFile WHERE PK_Line =
@Vueltas)
SET @Calificacion = (SELECT Calificacion FROM #tbl_TempFile WHERE PK_Line
= @Vueltas)
SET @Estado = (SELECT ESTADO FROM #tbl_TempFile WHERE PK_Line = @Vueltas)

EXEC SP_IMPORTAR_Calificaciones @Cedula, @Periodo, @Cod_Materia,
@Calificacion, @Estado
SET @Vueltas = @Vueltas + 1
END

DROP TABLE #tbl_TempFile

"Alejandro Mesa" wrote in
message news:
Nicola,

No entiendo que pasa. Cual metodo escogistes?. Si escogistes el segundo,
entonces recuerda crear la tabla temporal sin la columna identity, y
adicionarla despues de que la sentencia bulk insert haya terminado.
Fijate
que en el ejemplo esta comentada la columna.

> CREATE TABLE #tbl_TempFile(


...


AMB


"Nicola Strappazzon" wrote:

estaba probando tu metodo, pero no me funciona muy bien por que me dice
error al no conseguir la columna PK_Line, y me parece extraño, por q
hago un
select * from tabla, y si me muestra la columnas con sus respectivos ID,
pero hago un select buscando algo en esa columna en especifivo y nada...
me
da el error q te mencione :S

"Alejandro Mesa" wrote in
message
news:
> Nicola,
>
> El problema se debe a que el archivo de entrada no tiene los valores
> de la
> columna identity. En este caso debes crear un archivo con la
> especificacion
> del formato de la data contenida por tu archivo de entrada
> (exactamente
> igual
> que cuando usas BCP) y usar la opcion FORMATFILE [ =
> 'format_file_path' ]
> de
> la sentencia BULK INSERT. La otra opcion es crear la columna identity
> despues
> que hayas importado la data. Esta ultima opcion te dara mejor
> rendimiento
> puesto que mientras menos indices tengas, mas rapido sera el proceso
> de
> importacion.
>
>
> CREATE TABLE #tbl_TempFile(
> KEY,
> FK_Estudiante INT NOT NULL,
> CodMateria VARCHAR(8) NOT NULL,
> FK_Periodo INT NOT NULL,
> Calificacion TINYINT NOT NULL,
> ESTADO TINYINT NOT NULL
> )
>
> BULK INSERT #tbl_TempFile
> FROM 'D:\My Documents\Visual Studio
> Projects\Applications\SAVA2.0\Datos de
> prueba\Record Academico.TXT'
> WITH(
> FIELDTERMINATOR = '|',
> ROWTERMINATOR = ''
> )
>
> alter table #tbl_TempFile
> add PK_Line INT IDENTITY (1, 1) NOT NULL constraint pk_#tbl_TempFile
> primary
> key
>
>
> AMB
>
>
> "Nicola Strappazzon" wrote:
>
>> Ok. te pongo todos los datos.
>>
>> el formato del archivo es asi: 500 mil de esos registros hay en el
>> archivo
>> plano
>>
>> 11992015|06100102|67|11|6
>> 11992015|06100101|67|16|6
>> 11992015|06100103|67|14|6
>> 11992015|06100108|68|13|6
>> 11992015|06100206|68|14|6
>> 11992015|06100205|68|13|6
>> 11992015|06100201|68|15|6
>> 11992015|06100207|68|13|6
>> 11992015|06100203|68|14|6
>>
>> creo una tabla temporal para guardar esos datos.
>>
>> CREATE TABLE #tbl_TempFile(
>> PK_Line INT IDENTITY (1, 1) NOT FOR REPLICATION NOT NULL PRIMARY
>> KEY,
>> FK_Estudiante INT NOT NULL,
>> CodMateria VARCHAR(8) NOT NULL,
>> FK_Periodo INT NOT NULL,
>> Calificacion TINYINT NOT NULL,
>> ESTADO TINYINT NOT NULL
>> )
>>
>> despues executo la inscruccion para ver importar los datos.
>>
>> BULK INSERT #tbl_TempFile
>> FROM 'D:\My Documents\Visual Studio
>> Projects\Applications\SAVA2.0\Datos
>> de
>> prueba\Record Academico.TXT'
>> WITH(
>> FIELDTERMINATOR = '|',
>> ROWTERMINATOR = ''
>> )
>>
>> Y despues suelta el siguiente error:
>>
>> Server: Msg 4864, Level 16, State 1, Line 1
>> Bulk insert data conversion error (type mismatch) for row 1, column 5
>> (Calificacion).
>> Server: Msg 4864, Level 16, State 1, Line 1
>> Bulk insert data conversion error (type mismatch) for row 2, column 5
>> (Calificacion).
>> Server: Msg 4864, Level 16, State 1, Line 1
>> Bulk insert data conversion error (type mismatch) for row 3, column 5
>> (Calificacion).
>> Server: Msg 4864, Level 16, State 1, Line 1
>> Bulk insert data conversion error (type mismatch) for row 4, column 5
>> (Calificacion).
>> Server: Msg 4864, Level 16, State 1, Line 1
>> Bulk insert data conversion error (type mismatch) for row 5, column 5
>> (Calificacion).
>> Server: Msg 4864, Level 16, State 1, Line 1
>> Bulk insert data conversion error (type mismatch) for row 6, column 5
>> (Calificacion).
>> Server: Msg 4864, Level 16, State 1, Line 1
>> Bulk insert data conversion error (type mismatch) for row 7, column 5
>> (Calificacion).
>> Server: Msg 4864, Level 16, State 1, Line 1
>> Bulk insert data conversion error (type mismatch) for row 8, column 5
>> (Calificacion).
>> Server: Msg 4864, Level 16, State 1, Line 1
>> Bulk insert data conversion error (type mismatch) for row 9, column 5
>> (Calificacion).
>> Server: Msg 4864, Level 16, State 1, Line 1
>> Bulk insert data conversion error (type mismatch) for row 10, column
>> 5
>> (Calificacion).
>> Server: Msg 4864, Level 16, State 1, Line 1
>> Bulk insert data conversion error (type mismatch) for row 11, column
>> 5
>> (Calificacion).
>> Server: Msg 4865, Level 16, State 1, Line 1
>> Could not bulk insert because the maximum number of errors (10) was
>> exceeded.
>> Server: Msg 7399, Level 16, State 1, Line 1
>> OLE DB provider 'STREAM' reported an error. The provider did not give
>> any
>> information about the error.
>> OLE DB error trace [OLE/DB Provider 'STREAM' IRowset::GetNextRows
>> returned
>> 0x80004005: The provider did not give any information about the
>> error.].
>> The statement has been terminated.
>>
>> y alli me quede... no consigo info en internet:S
>>
>> "Alejandro Mesa" wrote in
>> message
>> news:
>> >
>> > Nicola,
>> >
>> > Vamos por parte, ok?
>> >
>> >> Hola de nuevo muchachos, estoy tratando de poder importar un
>> >> archivo a
>> >> una
>> >> tabla con primary key, pero al hacerlo me da un error
>> >
>> > Cual es el error que te da?
>> >
>> >> tabla con primary key, pero al hacerlo me da un error, le quito el
>> >> primary
>> >> key y funciona perfectamente, el caso es q tengo que después
>> >> recorrer
>> >> esa
>> >> tabla y necesito usar el primary key para poder hacerlo, ya que en
>> >> el
>> >> archivo q estoy importando existe un primary key pero no continuo,
>> >
>> > Cual es la definicion de la tabla?. Danos un poco de informacion
>> > sobre
>> > esa
>> > primary key.
>> >
>> > Por que necesitas que el pk sea consecutivo?
>> >
>> > AMB
>> >
>> > "Nicola Strappazzon" wrote:
>> >
>> >> Hola de nuevo muchachos, estoy tratando de poder importar un
>> >> archivo a
>> >> una
>> >> tabla con primary key, pero al hacerlo me da un error, le quito el
>> >> primary
>> >> key y funciona perfectamente, el caso es q tengo que después
>> >> recorrer
>> >> esa
>> >> tabla y necesito usar el primary key para poder hacerlo, ya que en
>> >> el
>> >> archivo q estoy importando existe un primary key pero no continuo,
>> >> que
>> >> es
>> >> la
>> >> Cedula de Identidad, como un numero de identificación en
>> >> Venezuela, y
>> >> no
>> >> puedo hacer un contador con eso por q no es un numero continuo y
>> >> seria
>> >> MUYYY
>> >> LAAARRRGGGOOOOO recorrerlo. Por eso el poner mi idea el PK en la
>> >> tabla
>> >> temporal, alguna sugerencia es bienvenida!
>> >>
>> >>
>> >>
>> >> Gracias.
>> >>
>> >>
>> >>
>>
>>
>>









Respuesta Responder a este mensaje
#13 Nicola Strappazzon
09/05/2005 - 15:10 | Informe spam
Buenos dias, aqui te mando el sp de la consulta sp_importar_calificacion.

Bien, te cuento q hace este SP, el recive del famoso archivo plano cada
registro y lo "normaliza" por decirlo de una forma, como es eso, bien, el
recoje una serie de datos por medio de un string "@Asignatura" y busca en la
DB su clave primaria para despues insertarlos en la tabla
tbl_MateriasInscritas.

ALTER PROCEDURE [SP_IMPORTAR_Calificaciones]
(@PK_Estudiante [int],
@FK_Periodo [int],
@Asignatura [varchar] (8),
@Calificacion [tinyint],
@FK_MateriaEstado [tinyint])
AS

SET NOCOUNT ON

DECLARE @Pensum INT
DECLARE @Escuela INT
DECLARE @Semestre INT
DECLARE @Ordinal INT
DECLARE @TEMP_Asignatura INT

SET @Pensum = SUBSTRING(@Asignatura, 1, 2)
SET @Escuela = SUBSTRING(@Asignatura, 3, 2)
SET @Semestre = SUBSTRING(@Asignatura, 5, 2)
SET @Ordinal = SUBSTRING(@Asignatura, 7, 2)

SET @TEMP_Asignatura = (SELECT PK_Asignatura
FROM dbo.tbl_Asignaturas
WHERE FK_Pensum = @Pensum AND
FK_Escuela = @Escuela AND
FK_Semestre = @Semestre AND
Ordinal = @Ordinal)

IF (EXISTS (SELECT PK_Persona FROM tbl_Personas WHERE PK_Persona =
@PK_Estudiante))
BEGIN
IF (NOT EXISTS (SELECT FK_Asignatura
FROM tbl_MateriasInscritas
WHERE FK_Estudiante = @PK_Estudiante AND
FK_Asignatura = @TEMP_Asignatura AND
FK_Periodo = @FK_Periodo AND
FK_MateriaEstado = @FK_MateriaEstado AND
Calificacion = @Calificacion))
BEGIN
INSERT INTO tbl_MateriasInscritas(
FK_Estudiante,
FK_Asignatura,
FK_Periodo,
FK_MateriaEstado,
Calificacion)
VALUES(
@PK_Estudiante,
@TEMP_Asignatura,
@FK_Periodo,
@FK_MateriaEstado,
@Calificacion)
RETURN 1
END
ELSE
BEGIN
RETURN -3
END
END
ELSE
BEGIN
RETURN -4
END



"Alejandro Mesa" wrote in message
news:
Nicola,

Decididamente que cuando uno puede ver el codigo se tiene una mejor idea
de
lo que esta pasando. Vamos por paso:

Ok. use el metodo 2, el llena la tabla perfectamente, le coloca la
columna
con clave primaria y funciona bien, pero cuando mando hacer una busqueda
con
el where no me reconose la columna con la clave primaria



Eso se debe a que declarastes la variable @Vueltas pero no la
inicializastes
en ningun momento por lo que su valor es NULL y ya tu sabes que no podemos
usar operadores de igualdad con valores NULL, asi que la sentencia:

SET @Cedula = (SELECT FK_Estudiante FROM #tbl_TempFile WHERE PK_Line >> @Vueltas)



no seleccionara nada pues PK_Line = @Vueltas no se cumplicara. Tampoco se
estava incrementando la variable en la expresion:

set @vueltas = @vueltas + 1

porque NULL mas cualquier valor es NULL.

Otra cosa, en una sentencia select se pouede asignar mas de una variable,
asi que en vez de tener cinco sentencias select para asignar valor a cada
una
de tus variables, puedes usar una sola sentencia donde se le asigna el
valor
de la columna correspondiente a cada variable:

SELECT
@Cedula = FK_Estudiante,
@Cod_Materia = CodMateria,
@Periodo = FK_Periodo,
@Calificacion = Calificacion,
@Estado = ESTADO
FROM #tbl_TempFile
WHERE PK_Line = @Vueltas

Ahora biene el ultimo punto. De la forma que lo haces, es igual que si
estuvieses usando cursores, pues a la final recorres la tabla fila a fila
y
en 500,000 filas esto te tomara bastante tiempo. Lo que queda por saber
ahora
es lo que hace el procedimiento SP_IMPORTAR_Calificaciones, el cual se
debe
adaptar para manipular la tabla temporal como un conjunbto y no fila a
fila.
Aca te pongo el script con los arreglos necesarios para que corra, solo
falta
que nos dejes saber lo que hace el procedimiento para cambiarlo y buscar
una
solucion de conjunto.


SET NOCOUNT ON

DECLARE @Vueltas INT
DECLARE @Cedula INT
DECLARE @Cod_Materia VARCHAR(8)
DECLARE @Periodo INT
DECLARE @Calificacion TINYINT
DECLARE @Estado TINYINT
declare @i int

CREATE TABLE #tbl_TempFile(
FK_Estudiante INT NOT NULL,
CodMateria VARCHAR(8) NOT NULL,
FK_Periodo INT NOT NULL,
Calificacion TINYINT NOT NULL,
ESTADO TINYINT NOT NULL
)

BULK INSERT #tbl_TempFile
FROM 'D:\My Documents\Visual Studio Projects\Applications\SAVA2.0\Datos de
prueba\Archivos a Importar\Record Academico.TXT'
WITH(
FIELDTERMINATOR = '|',
ROWTERMINATOR = ''
)

ALTER TABLE #tbl_TempFile
ADD PK_Line INT IDENTITY (1, 1) NOT FOR REPLICATION NOT NULL PRIMARY KEY

set @vueltas = 1
set @i = (SELECT COUNT(*) FROM #tbl_TempFile)

WHILE(@Vueltas <= @i)
BEGIN
SELECT
@Cedula = FK_Estudiante,
@Cod_Materia = CodMateria,
@Periodo = FK_Periodo,
@Calificacion = Calificacion,
@Estado = ESTADO
FROM #tbl_TempFile
WHERE PK_Line = @Vueltas

EXEC SP_IMPORTAR_Calificaciones @Cedula, @Periodo, @Cod_Materia,
@Calificacion, @Estado
SET @Vueltas = @Vueltas + 1
END

DROP TABLE #tbl_TempFile
go


AMB

"Nicola Strappazzon" wrote:

Ok. use el metodo 2, el llena la tabla perfectamente, le coloca la
columna
con clave primaria y funciona bien, pero cuando mando hacer una busqueda
con
el where no me reconose la columna con la clave primaria, Recuerda que
estoy
tratando de poder migrar los 500.000 mil registros usando conjuntos y no
cursores como me hablaron aller.

Te muestro el codigo:

SET NOCOUNT ON

DECLARE @Vueltas INT
DECLARE @Cedula INT
DECLARE @Cod_Materia VARCHAR(8)
DECLARE @Periodo INT
DECLARE @Calificacion TINYINT
DECLARE @Estado TINYINT

CREATE TABLE #tbl_TempFile(
FK_Estudiante INT NOT NULL,
CodMateria VARCHAR(8) NOT NULL,
FK_Periodo INT NOT NULL,
Calificacion TINYINT NOT NULL,
ESTADO TINYINT NOT NULL)

BULK INSERT #tbl_TempFile
FROM 'D:\My Documents\Visual Studio Projects\Applications\SAVA2.0\Datos
de
prueba\Archivos a Importar\Record Academico.TXT'
WITH(
FIELDTERMINATOR = '|',
ROWTERMINATOR = ''
)

ALTER TABLE #tbl_TempFile
ADD PK_Line INT IDENTITY (1, 1) NOT FOR REPLICATION NOT NULL PRIMARY KEY

PK_Line FROM #tbl_TempFile

WHILE(@Vueltas <= (SELECT COUNT(*) FROM #tbl_TempFile))
BEGIN
SET @Cedula = (SELECT FK_Estudiante FROM #tbl_TempFile WHERE PK_Line >> @Vueltas)
SET @Cod_Materia = (SELECT CodMateria FROM #tbl_TempFile WHERE PK_Line >> @Vueltas)
SET @Periodo = (SELECT FK_Periodo FROM #tbl_TempFile WHERE PK_Line >> @Vueltas)
SET @Calificacion = (SELECT Calificacion FROM #tbl_TempFile WHERE
PK_Line >> @Vueltas)
SET @Estado = (SELECT ESTADO FROM #tbl_TempFile WHERE PK_Line =
@Vueltas)

EXEC SP_IMPORTAR_Calificaciones @Cedula, @Periodo, @Cod_Materia,
@Calificacion, @Estado
SET @Vueltas = @Vueltas + 1
END

DROP TABLE #tbl_TempFile

"Alejandro Mesa" wrote in
message
news:
> Nicola,
>
> No entiendo que pasa. Cual metodo escogistes?. Si escogistes el
> segundo,
> entonces recuerda crear la tabla temporal sin la columna identity, y
> adicionarla despues de que la sentencia bulk insert haya terminado.
> Fijate
> que en el ejemplo esta comentada la columna.
>
>> > CREATE TABLE #tbl_TempFile(
>> > PRIMARY
> ...
>
>
> AMB
>
>
> "Nicola Strappazzon" wrote:
>
>> estaba probando tu metodo, pero no me funciona muy bien por que me
>> dice
>> error al no conseguir la columna PK_Line, y me parece extraño, por q
>> hago
>> un
>> select * from tabla, y si me muestra la columnas con sus respectivos
>> ID,
>> pero hago un select buscando algo en esa columna en especifivo y
>> nada...
>> me
>> da el error q te mencione :S
>>
>> "Alejandro Mesa" wrote in
>> message
>> news:
>> > Nicola,
>> >
>> > El problema se debe a que el archivo de entrada no tiene los valores
>> > de
>> > la
>> > columna identity. En este caso debes crear un archivo con la
>> > especificacion
>> > del formato de la data contenida por tu archivo de entrada
>> > (exactamente
>> > igual
>> > que cuando usas BCP) y usar la opcion FORMATFILE [ >> >> > 'format_file_path' ]
>> > de
>> > la sentencia BULK INSERT. La otra opcion es crear la columna
>> > identity
>> > despues
>> > que hayas importado la data. Esta ultima opcion te dara mejor
>> > rendimiento
>> > puesto que mientras menos indices tengas, mas rapido sera el proceso
>> > de
>> > importacion.
>> >
>> >
>> > CREATE TABLE #tbl_TempFile(
>> > PRIMARY
>> > KEY,
>> > FK_Estudiante INT NOT NULL,
>> > CodMateria VARCHAR(8) NOT NULL,
>> > FK_Periodo INT NOT NULL,
>> > Calificacion TINYINT NOT NULL,
>> > ESTADO TINYINT NOT NULL
>> > )
>> >
>> > BULK INSERT #tbl_TempFile
>> > FROM 'D:\My Documents\Visual Studio
>> > Projects\Applications\SAVA2.0\Datos
>> > de
>> > prueba\Record Academico.TXT'
>> > WITH(
>> > FIELDTERMINATOR = '|',
>> > ROWTERMINATOR = ''
>> > )
>> >
>> > alter table #tbl_TempFile
>> > add PK_Line INT IDENTITY (1, 1) NOT NULL constraint pk_#tbl_TempFile
>> > primary
>> > key
>> >
>> >
>> > AMB
>> >
>> >
>> > "Nicola Strappazzon" wrote:
>> >
>> >> Ok. te pongo todos los datos.
>> >>
>> >> el formato del archivo es asi: 500 mil de esos registros hay en el
>> >> archivo
>> >> plano
>> >>
>> >> 11992015|06100102|67|11|6
>> >> 11992015|06100101|67|16|6
>> >> 11992015|06100103|67|14|6
>> >> 11992015|06100108|68|13|6
>> >> 11992015|06100206|68|14|6
>> >> 11992015|06100205|68|13|6
>> >> 11992015|06100201|68|15|6
>> >> 11992015|06100207|68|13|6
>> >> 11992015|06100203|68|14|6
>> >>
>> >> creo una tabla temporal para guardar esos datos.
>> >>
>> >> CREATE TABLE #tbl_TempFile(
>> >> PK_Line INT IDENTITY (1, 1) NOT FOR REPLICATION NOT NULL
>> >> PRIMARY
>> >> KEY,
>> >> FK_Estudiante INT NOT NULL,
>> >> CodMateria VARCHAR(8) NOT NULL,
>> >> FK_Periodo INT NOT NULL,
>> >> Calificacion TINYINT NOT NULL,
>> >> ESTADO TINYINT NOT NULL
>> >> )
>> >>
>> >> despues executo la inscruccion para ver importar los datos.
>> >>
>> >> BULK INSERT #tbl_TempFile
>> >> FROM 'D:\My Documents\Visual Studio
>> >> Projects\Applications\SAVA2.0\Datos
>> >> de
>> >> prueba\Record Academico.TXT'
>> >> WITH(
>> >> FIELDTERMINATOR = '|',
>> >> ROWTERMINATOR = ''
>> >> )
>> >>
>> >> Y despues suelta el siguiente error:
>> >>
>> >> Server: Msg 4864, Level 16, State 1, Line 1
>> >> Bulk insert data conversion error (type mismatch) for row 1, column
>> >> 5
>> >> (Calificacion).
>> >> Server: Msg 4864, Level 16, State 1, Line 1
>> >> Bulk insert data conversion error (type mismatch) for row 2, column
>> >> 5
>> >> (Calificacion).
>> >> Server: Msg 4864, Level 16, State 1, Line 1
>> >> Bulk insert data conversion error (type mismatch) for row 3, column
>> >> 5
>> >> (Calificacion).
>> >> Server: Msg 4864, Level 16, State 1, Line 1
>> >> Bulk insert data conversion error (type mismatch) for row 4, column
>> >> 5
>> >> (Calificacion).
>> >> Server: Msg 4864, Level 16, State 1, Line 1
>> >> Bulk insert data conversion error (type mismatch) for row 5, column
>> >> 5
>> >> (Calificacion).
>> >> Server: Msg 4864, Level 16, State 1, Line 1
>> >> Bulk insert data conversion error (type mismatch) for row 6, column
>> >> 5
>> >> (Calificacion).
>> >> Server: Msg 4864, Level 16, State 1, Line 1
>> >> Bulk insert data conversion error (type mismatch) for row 7, column
>> >> 5
>> >> (Calificacion).
>> >> Server: Msg 4864, Level 16, State 1, Line 1
>> >> Bulk insert data conversion error (type mismatch) for row 8, column
>> >> 5
>> >> (Calificacion).
>> >> Server: Msg 4864, Level 16, State 1, Line 1
>> >> Bulk insert data conversion error (type mismatch) for row 9, column
>> >> 5
>> >> (Calificacion).
>> >> Server: Msg 4864, Level 16, State 1, Line 1
>> >> Bulk insert data conversion error (type mismatch) for row 10,
>> >> column 5
>> >> (Calificacion).
>> >> Server: Msg 4864, Level 16, State 1, Line 1
>> >> Bulk insert data conversion error (type mismatch) for row 11,
>> >> column 5
>> >> (Calificacion).
>> >> Server: Msg 4865, Level 16, State 1, Line 1
>> >> Could not bulk insert because the maximum number of errors (10) was
>> >> exceeded.
>> >> Server: Msg 7399, Level 16, State 1, Line 1
>> >> OLE DB provider 'STREAM' reported an error. The provider did not
>> >> give
>> >> any
>> >> information about the error.
>> >> OLE DB error trace [OLE/DB Provider 'STREAM' IRowset::GetNextRows
>> >> returned
>> >> 0x80004005: The provider did not give any information about the
>> >> error.].
>> >> The statement has been terminated.
>> >>
>> >> y alli me quede... no consigo info en internet:S
>> >>
>> >> "Alejandro Mesa" wrote in
>> >> message
>> >> news:
>> >> >
>> >> > Nicola,
>> >> >
>> >> > Vamos por parte, ok?
>> >> >
>> >> >> Hola de nuevo muchachos, estoy tratando de poder importar un
>> >> >> archivo a
>> >> >> una
>> >> >> tabla con primary key, pero al hacerlo me da un error
>> >> >
>> >> > Cual es el error que te da?
>> >> >
>> >> >> tabla con primary key, pero al hacerlo me da un error, le quito
>> >> >> el
>> >> >> primary
>> >> >> key y funciona perfectamente, el caso es q tengo que después
>> >> >> recorrer
>> >> >> esa
>> >> >> tabla y necesito usar el primary key para poder hacerlo, ya que
>> >> >> en
>> >> >> el
>> >> >> archivo q estoy importando existe un primary key pero no
>> >> >> continuo,
>> >> >
>> >> > Cual es la definicion de la tabla?. Danos un poco de informacion
>> >> > sobre
>> >> > esa
>> >> > primary key.
>> >> >
>> >> > Por que necesitas que el pk sea consecutivo?
>> >> >
>> >> > AMB
>> >> >
>> >> > "Nicola Strappazzon" wrote:
>> >> >
>> >> >> Hola de nuevo muchachos, estoy tratando de poder importar un
>> >> >> archivo a
>> >> >> una
>> >> >> tabla con primary key, pero al hacerlo me da un error, le quito
>> >> >> el
>> >> >> primary
>> >> >> key y funciona perfectamente, el caso es q tengo que después
>> >> >> recorrer
>> >> >> esa
>> >> >> tabla y necesito usar el primary key para poder hacerlo, ya que
>> >> >> en
>> >> >> el
>> >> >> archivo q estoy importando existe un primary key pero no
>> >> >> continuo,
>> >> >> que
>> >> >> es
>> >> >> la
>> >> >> Cedula de Identidad, como un numero de identificación en
>> >> >> Venezuela,
>> >> >> y
>> >> >> no
>> >> >> puedo hacer un contador con eso por q no es un numero continuo y
>> >> >> seria
>> >> >> MUYYY
>> >> >> LAAARRRGGGOOOOO recorrerlo. Por eso el poner mi idea el PK en la
>> >> >> tabla
>> >> >> temporal, alguna sugerencia es bienvenida!
>> >> >>
>> >> >>
>> >> >>
>> >> >> Gracias.
>> >> >>
>> >> >>
>> >> >>
>> >>
>> >>
>> >>
>>
>>
>>



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida