Tengo un administrador de tabla con una sola columna, adminId, que es la clave principal. Debido a las reglas comerciales, tiene que ser así.
Me gustaría entender de una vez por todas cómo puedo escribir procedimientos almacenados que inserten valores en tablas como esta. Estoy usando SQL Server y T-SQL e intenté usar SCOPE_IDENTITY () pero eso no funciona ya que la tabla tiene INSERT_IDENTITY en falso o apagado.
Realmente me gustaría no insertar un valor ficticio solo para poder insertar una nueva fila. ¡Gracias!
Respuestas:
Si tiene una columna que es una IDENTIDAD, simplemente haga esto
INSERT MyTable DEFAULT VALUES; --allows no column list. The default will be the IDENTITY SELECT SCOPE_IDENTITY();
Si no tiene identidad, ¿puede configurarla? Esta es la mejor manera ... y usa el SQL anterior.
Si no es así, desea insertar una nueva fila.
INSERT MyTable (admidid) OUTPUT INSERTED.admidid --returns result to caller SELECT ISNULL(MAX(admidid), 0) + 1 FROM MyTable
Notas:
fuente
Debe agregar IDENTITY_INSERT a su declaración de selección:
SET IDENTITY_INSERT MyTable ON INSERT INTO MyTable (AdminCol) SELECT AdminColValue FROM Tableb
Cuando haya terminado, asegúrese de recordar
SET IDENTITY_INSERT MyTable OFF
Aquí hay una buena descripción de cómo funciona desde BOL: http://msdn.microsoft.com/en-us/library/aa259221(SQL.80).aspx
fuente
@Phil: ¿No quiere decir que su tabla tiene dos (2) columnas, la columna PK de aumento automático y una columna AdminName? Si solo tiene una columna donde va el AdminName, el AdminName es el PK y, por supuesto, no puede aumentar automáticamente una cadena. ¿Esperan las reglas de negocio que establezca un nombre de usuario de Windows totalmente calificado como clave principal? Eso sería viable y tendría sentido, porque entonces no necesitaría un índice único alternativo en la columna AdminName.
Pero si su tabla tiene dos columnas, no una:
En SQLServer, el autoincremento es parte de la definición de tabla / columna. Usted define la columna como un número entero y luego también la convierte en una columna de identidad, especificando el incremento, generalmente 1, pero podría ser 2 o 5 o 10 o lo que sea. Para insertar una fila, simplemente inserte los valores de las otras columnas y no haga nada con la columna PK:
insert into T (foo) -- column(s) list values('bar') -- values list
Su proceso almacenado que realiza la inserción puede hacer que SCOPE_IDENTITY sea un valor RETURN o SCOPE_IDENTITY se puede devolver al cliente como un parámetro OUT.
PS SCOPE_IDENTITY () devuelve el valor de identidad autoincrementado generado más recientemente en el ámbito actual; no genera el siguiente valor de identidad.
EDITAR:
Presumiblemente, su tabla Administradores contiene un conjunto de administradores. Pero si no tiene ninguna columna que no sea la columna de clave primaria entera, no hay forma de identificar a los administradores; lo único que puede hacer es distinguirlos entre sí. Eso no te lleva muy lejos. Pero si su tabla de administrador tenía alguna de las siguientes estructuras:
O
podría hacer referencia a la tabla del administrador desde otras tablas, y las claves externas serían SIGNIFICATIVAS. Y eso es precisamente lo que le falta a una tabla que consta de una sola columna de números enteros: significado.
Al tener dos columnas, puede hacer que un procedimiento almacenado haga esto:
insert into Administrators (windowsusername) values('mydomain\someusername'); return SCOPE_IDENTITY();
y su programa-cliente recuperaría como valor de retorno el ID autoincrementado que se había generado automáticamente y asignado a la fila recién insertada. Este enfoque es la práctica habitual y me atrevería a decir que se considera una "mejor práctica".
PD: Mencionas que no sabías cómo "insertar un valor" si "no tenías nada que insertar". Hay una contradicción ahí. Si no tiene nada que insertar, ¿por qué hacerlo? ¿Por qué crearía, digamos, un nuevo registro de CLIENTE si no sabe absolutamente nada sobre el cliente? ¿No es su nombre, su ciudad, su número de teléfono, nada?
fuente
But an autoincrementing integer whose autoincrementation must be disabled is a poor solution.
Todo lo que necesita es una tabla paralela con una relación de uno a uno con la tabla de usuarios y en esa tabla crea una columna de bits. Cuando esa columna es verdadera, significa que el usuario tiene administrador. Limpiar. Estándar. Diseño.