¿Manejar columnas de identidad en una instrucción" Insert Into TABLE Values ()"?


En SQL Server 2000 o superior, ¿hay alguna manera de manejar una columna de clave primaria (identidad) generada automáticamente cuando se usa una instrucción como la siguiente?

Insert Into TableName Values(?, ?, ?)

Mi objetivo es NO usar los nombres de columna en absoluto.

Author: James McMahon, 2009-06-01

6 answers

De forma predeterminada, si tiene una columna de identidad, no necesita especificarla en la sección VALORES. Si su tabla es:

ID    NAME    ADDRESS

Entonces puedes hacer:

INSERT INTO MyTbl VALUES ('Joe', '123 State Street, Boston, MA')

Esto generará automáticamente el ID para usted, y no tiene que pensar en ello en absoluto. Si SET IDENTITY_INSERT MyTbl ON, puede asignar un valor a la columna ID.

 52
Author: Eric,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-17 14:07:40

Otro "truco" para generar la lista de columnas es simplemente arrastrar el nodo "Columnas" desde el Explorador de objetos a una ventana de consulta.

 23
Author: Aaron Bertrand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-01 15:42:07

La mejor práctica es enumerar explícitamente las columnas:

Insert Into TableName(col1, col2,col2) Values(?, ?, ?)

De lo contrario, su inserción original se romperá si agrega otra columna a su tabla.

 11
Author: A-K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-13 08:58:58

Tienes 2 opciones:

1) Especifique la lista de nombres de columna (sin la columna identidad).

2) ACTIVE IDENTITY_INSERT tablename, seguido de instrucciones insert que proporcionan valores explícitos para la columna identity, seguido de DESACTIVE IDENTITY_INSERT tablename.

Si usted está evitando una lista de nombres de columna, tal vez este 'truco' podría ayudar?:

-- Get a comma separated list of a table's column names
SELECT STUFF(
(SELECT 
',' + COLUMN_NAME AS [text()]
FROM 
INFORMATION_SCHEMA.COLUMNS
WHERE 
TABLE_NAME = 'TableName'
Order By Ordinal_position
FOR XML PATH('')
), 1,1, '')
 6
Author: Mitch Wheat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-01 23:41:16

Dado que no es práctico poner código en un comentario, en respuesta a su comentario en la respuesta de Eric que no está funcionando para usted...

Acabo de ejecutar lo siguiente en una caja SQL 2005 (lo siento, no hay 2000 a mano) con la configuración predeterminada y funcionó sin error:

CREATE TABLE dbo.Test_Identity_Insert
(
    id  INT IDENTITY NOT NULL,
    my_string   VARCHAR(20) NOT NULL,
    CONSTRAINT PK_Test_Identity_Insert PRIMARY KEY CLUSTERED (id)
)
GO

INSERT INTO dbo.Test_Identity_Insert VALUES ('test')
GO

SELECT * FROM dbo.Test_Identity_Insert
GO

¿Está enviando el valor ID en su lista de valores? No creo que puedas hacer que ignore la columna si realmente le pasas un valor. Por ejemplo, si la tabla tiene 6 columnas y desea ignorar la columna IDENTIDAD solo puede pasar 5 valores.

 2
Author: Tom H,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-01 15:42:00
set identity_insert customer on
insert into Customer(id,Name,city,Salary) values(8,'bcd','Amritsar',1234)

Donde "cliente" es el nombre de la tabla

 0
Author: sohan yadav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-13 10:06:45