numerar registros

25/06/2007 - 18:13 por fernando C | Informe spam
Buenas...
lo que necesito es numerar los registros de una tabla. Es decir al crear una
tabla copiandola de otra le agrego el campo NroReg y necesito que los numere
secuenciamente.
La sentencia que uso es del tipo "Select NroLin,* into T2 from T1" como
hago para que ese NroReg se incremente numerando los registros? Existe la
forma? o no queda otra que leer la T1 e ir grabando la T2 con un Insert
incrementando una variable por cada lectura?

Muchas gracias.
Fernando C.

Preguntas similare

Leer las respuestas

#1 Jesús López
25/06/2007 - 20:14 | Informe spam
Existe la manera y funciona perfectamente en SQL 2000 y 2005. Se trata de
usar la función IDENTITY( tipo, semilla, incremento) en la instrucción
SELECT INTO:

USE TestDB

IF OBJECT_ID('dbo.TestTable') IS NOT NULL
DROP TABLE TestTable

CREATE TABLE TestTable
(
Id int PRIMARY KEY,
C1 int,
C2 int,
C3 int,
C4 int
)


INSERT INTO TestTable VALUES(1, 2, 3, 4, 5)
INSERT INTO TestTable VALUES(2, 1, 3, 4, 5)
INSERT INTO TestTable VALUES(3, 2, 1, 4, 5)
INSERT INTO TestTable VALUES(4, 2, 3, 1, 5)
INSERT INTO TestTable VALUES(5, 2, 3, 4, 1)

IF OBJECT_ID('dbo.TableCopy') IS NOT NULL
DROP TABLE TableCopy

SELECT IDENTITY(int, 1, 1) AS RowNumber, * INTO TableCopy
FROM TestTable
ORDER BY Id

SELECT * FROM TableCopy

No te olvides de especificar ORDER BY, si no SQL Server insertará los
registros en el orden que mejor le parezca.

Saludos:

Jesús López.
Solid Quality Mentors
www.solidq.com

"fernando C" escribió en el mensaje
news:
Buenas...
lo que necesito es numerar los registros de una tabla. Es decir al crear
una
tabla copiandola de otra le agrego el campo NroReg y necesito que los
numere
secuenciamente.
La sentencia que uso es del tipo "Select NroLin,* into T2 from T1" como
hago para que ese NroReg se incremente numerando los registros? Existe la
forma? o no queda otra que leer la T1 e ir grabando la T2 con un Insert
incrementando una variable por cada lectura?

Muchas gracias.
Fernando C.
Respuesta Responder a este mensaje
#2 Alejandro Mesa
26/06/2007 - 15:18 | Informe spam
Hola Jesús,

No les recomiendo que usen ese metodo, puesto que Microsoft no garantiza un
comportamineto adecuado de la funcion IDENTITY cuando se usa "select into" en
conjunto con "order by".

The behavior of the IDENTITY function when used with SELECT INTO or INSERT
.. SELECT queries that contain an ORDER BY clause
http://support.microsoft.com/kb/273586

Preferible que se cree la tabla con una columna "ideneity" y luego insertar
usando "select ... order by".


AMB



"Jesús López" wrote:

Existe la manera y funciona perfectamente en SQL 2000 y 2005. Se trata de
usar la función IDENTITY( tipo, semilla, incremento) en la instrucción
SELECT INTO:

USE TestDB

IF OBJECT_ID('dbo.TestTable') IS NOT NULL
DROP TABLE TestTable

CREATE TABLE TestTable
(
Id int PRIMARY KEY,
C1 int,
C2 int,
C3 int,
C4 int
)


INSERT INTO TestTable VALUES(1, 2, 3, 4, 5)
INSERT INTO TestTable VALUES(2, 1, 3, 4, 5)
INSERT INTO TestTable VALUES(3, 2, 1, 4, 5)
INSERT INTO TestTable VALUES(4, 2, 3, 1, 5)
INSERT INTO TestTable VALUES(5, 2, 3, 4, 1)

IF OBJECT_ID('dbo.TableCopy') IS NOT NULL
DROP TABLE TableCopy

SELECT IDENTITY(int, 1, 1) AS RowNumber, * INTO TableCopy
FROM TestTable
ORDER BY Id

SELECT * FROM TableCopy

No te olvides de especificar ORDER BY, si no SQL Server insertará los
registros en el orden que mejor le parezca.

Saludos:

Jesús López.
Solid Quality Mentors
www.solidq.com

"fernando C" escribió en el mensaje
news:
> Buenas...
> lo que necesito es numerar los registros de una tabla. Es decir al crear
> una
> tabla copiandola de otra le agrego el campo NroReg y necesito que los
> numere
> secuenciamente.
> La sentencia que uso es del tipo "Select NroLin,* into T2 from T1" como
> hago para que ese NroReg se incremente numerando los registros? Existe la
> forma? o no queda otra que leer la T1 e ir grabando la T2 con un Insert
> incrementando una variable por cada lectura?
>
> Muchas gracias.
> Fernando C.



Respuesta Responder a este mensaje
#3 Jesús López
26/06/2007 - 16:29 | Informe spam
Sin embargo INSERT INTO es mucho más eficiente que INSERT ... SELECT, porque
puede ser una operación mínimamente registrada.

Además el mayor peligro que es la ejecución paralela puede controlarse con
un hint:

SELECT Col1, Col2, IDENTITY(int, 1, 1) AS ID INTO NewTable
FROM OldTable
ORDER BY Col1 OPTION (MAXDOP 1)

También puede verse el plan de ejcución y en caso necesario forzar de alguna
manera que la llamada a GetIdentity se produzca después del SORT si lo hay,
también usando hints y otros trucos.

Saludos:

Jesús López.
Solid Quality Mentors
www.solidq.com

"Alejandro Mesa" escribió en el
mensaje news:
Hola Jesús,

No les recomiendo que usen ese metodo, puesto que Microsoft no garantiza
un
comportamineto adecuado de la funcion IDENTITY cuando se usa "select into"
en
conjunto con "order by".

The behavior of the IDENTITY function when used with SELECT INTO or INSERT
.. SELECT queries that contain an ORDER BY clause
http://support.microsoft.com/kb/273586

Preferible que se cree la tabla con una columna "ideneity" y luego
insertar
usando "select ... order by".


AMB



"Jesús López" wrote:

Existe la manera y funciona perfectamente en SQL 2000 y 2005. Se trata de
usar la función IDENTITY( tipo, semilla, incremento) en la instrucción
SELECT INTO:

USE TestDB

IF OBJECT_ID('dbo.TestTable') IS NOT NULL
DROP TABLE TestTable

CREATE TABLE TestTable
(
Id int PRIMARY KEY,
C1 int,
C2 int,
C3 int,
C4 int
)


INSERT INTO TestTable VALUES(1, 2, 3, 4, 5)
INSERT INTO TestTable VALUES(2, 1, 3, 4, 5)
INSERT INTO TestTable VALUES(3, 2, 1, 4, 5)
INSERT INTO TestTable VALUES(4, 2, 3, 1, 5)
INSERT INTO TestTable VALUES(5, 2, 3, 4, 1)

IF OBJECT_ID('dbo.TableCopy') IS NOT NULL
DROP TABLE TableCopy

SELECT IDENTITY(int, 1, 1) AS RowNumber, * INTO TableCopy
FROM TestTable
ORDER BY Id

SELECT * FROM TableCopy

No te olvides de especificar ORDER BY, si no SQL Server insertará los
registros en el orden que mejor le parezca.

Saludos:

Jesús López.
Solid Quality Mentors
www.solidq.com

"fernando C" escribió en el mensaje
news:
> Buenas...
> lo que necesito es numerar los registros de una tabla. Es decir al
> crear
> una
> tabla copiandola de otra le agrego el campo NroReg y necesito que los
> numere
> secuenciamente.
> La sentencia que uso es del tipo "Select NroLin,* into T2 from T1"
> como
> hago para que ese NroReg se incremente numerando los registros? Existe
> la
> forma? o no queda otra que leer la T1 e ir grabando la T2 con un Insert
> incrementando una variable por cada lectura?
>
> Muchas gracias.
> Fernando C.



Respuesta Responder a este mensaje
#4 Alejandro Mesa
26/06/2007 - 17:42 | Informe spam
Jesús,

El problema aqui no es si es mejor o peor, el problema aqui es que ese
metodo no esta garantizado a que de el resultado esperado.

"While you may see scenarios in which a SELECT INTO with an IDENTITY
function and an ORDER BY clause produce values in an order that you desire
this behavior is not guaranteed and may change without warning."


AMB


"Jesús López" wrote:

Sin embargo INSERT INTO es mucho más eficiente que INSERT ... SELECT, porque
puede ser una operación mínimamente registrada.

Además el mayor peligro que es la ejecución paralela puede controlarse con
un hint:

SELECT Col1, Col2, IDENTITY(int, 1, 1) AS ID INTO NewTable
FROM OldTable
ORDER BY Col1 OPTION (MAXDOP 1)

También puede verse el plan de ejcución y en caso necesario forzar de alguna
manera que la llamada a GetIdentity se produzca después del SORT si lo hay,
también usando hints y otros trucos.

Saludos:

Jesús López.
Solid Quality Mentors
www.solidq.com

"Alejandro Mesa" escribió en el
mensaje news:
> Hola Jesús,
>
> No les recomiendo que usen ese metodo, puesto que Microsoft no garantiza
> un
> comportamineto adecuado de la funcion IDENTITY cuando se usa "select into"
> en
> conjunto con "order by".
>
> The behavior of the IDENTITY function when used with SELECT INTO or INSERT
> .. SELECT queries that contain an ORDER BY clause
> http://support.microsoft.com/kb/273586
>
> Preferible que se cree la tabla con una columna "ideneity" y luego
> insertar
> usando "select ... order by".
>
>
> AMB
>
>
>
> "Jesús López" wrote:
>
>> Existe la manera y funciona perfectamente en SQL 2000 y 2005. Se trata de
>> usar la función IDENTITY( tipo, semilla, incremento) en la instrucción
>> SELECT INTO:
>>
>> USE TestDB
>>
>> IF OBJECT_ID('dbo.TestTable') IS NOT NULL
>> DROP TABLE TestTable
>>
>> CREATE TABLE TestTable
>> (
>> Id int PRIMARY KEY,
>> C1 int,
>> C2 int,
>> C3 int,
>> C4 int
>> )
>>
>>
>> INSERT INTO TestTable VALUES(1, 2, 3, 4, 5)
>> INSERT INTO TestTable VALUES(2, 1, 3, 4, 5)
>> INSERT INTO TestTable VALUES(3, 2, 1, 4, 5)
>> INSERT INTO TestTable VALUES(4, 2, 3, 1, 5)
>> INSERT INTO TestTable VALUES(5, 2, 3, 4, 1)
>>
>> IF OBJECT_ID('dbo.TableCopy') IS NOT NULL
>> DROP TABLE TableCopy
>>
>> SELECT IDENTITY(int, 1, 1) AS RowNumber, * INTO TableCopy
>> FROM TestTable
>> ORDER BY Id
>>
>> SELECT * FROM TableCopy
>>
>> No te olvides de especificar ORDER BY, si no SQL Server insertará los
>> registros en el orden que mejor le parezca.
>>
>> Saludos:
>>
>> Jesús López.
>> Solid Quality Mentors
>> www.solidq.com
>>
>> "fernando C" escribió en el mensaje
>> news:
>> > Buenas...
>> > lo que necesito es numerar los registros de una tabla. Es decir al
>> > crear
>> > una
>> > tabla copiandola de otra le agrego el campo NroReg y necesito que los
>> > numere
>> > secuenciamente.
>> > La sentencia que uso es del tipo "Select NroLin,* into T2 from T1"
>> > como
>> > hago para que ese NroReg se incremente numerando los registros? Existe
>> > la
>> > forma? o no queda otra que leer la T1 e ir grabando la T2 con un Insert
>> > incrementando una variable por cada lectura?
>> >
>> > Muchas gracias.
>> > Fernando C.
>>
>>
>>



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