Pregunta

Tengo cuatro tablas:. Mensajes, MessageCategory, MessageStatus y MessageLevel

MessageCategory, MessageStatus y MessageLevel todos sólo tienen tres campos: Identidad (clave primaria), código y descripción. Los mensajes se refiere a estos tres campos y tiene algunos otros campos de datos, incluyendo la identidad (clave principal) MessageText y Orden. Los campos de identidad son los campos de incremento automático.

Ahora necesita escribir una secuencia de comandos SQL para agregar algunos datos por defecto a las cuatro tablas. El problema es que tengo que crear un script que será enviado a un cliente que va a continuación, ejecutar este script. No puedo escribir un poco de código más inteligente que hacer toda la actualización. Y mientras que tres tablas son las declaraciones de inserción simples, es la tabla de mensajes que me provoca algunos dolores de cabeza adicionales.

No puedo quitar cualquier índices y no puedo asumir que empieza a contar en 1 para las claves primarias.

Así, como ejemplo, es ella algunos datos:

INSERT INTO MessageCategory (Code) Values ('Cat01');
INSERT INTO MessageStatus (Code) Values ('Status01');
INSERT INTO MessageLevel (Code) Values ('Level01');

Y los mensajes necesitarían algo como esto:

INSERT INTO Messages(Category, Status, Level, MessageText, Order) 
VALUES(
  (SELECT Identity from MessageCategory where Code='Cat01'), 
  (SELECT Identity from MessageStatus where Code='Status01'), 
  (SELECT Identity from MessageLevel where Code='Level01'), 
  'Just some message', 
  1
);

Eso no funcionará, sin embargo. Así que, ¿cuál es el truco para conseguir este trabajo? (Mantener el código legible también ...)

Por desgracia, no tengo acceso a la otra base de datos. Puedo probarlo, pero una vez que parece que funciona, es sólo una cuestión de enviar-y-orar-que-funciona ...

¿Fue útil?

Solución

INSERT INTO Messages 
  (Category, Status, Level, MessageText, [Order]) 
SELECT
  (SELECT TOP 1 [Identity] from MessageCategory where Code='Cat01')  AS Category,
  (SELECT TOP 1 [Identity] from MessageStatus where Code='Status01') AS Status,
  (SELECT TOP 1 [Identity] from MessageLevel where Code='Level01')   AS Level,
  (SELECT 'Just some message')   AS MessageText, 
  (SELECT 1)                     AS [Order]

Lo anterior podría funcionar para SQL Server. Tenga en cuenta que tanto Identity y Order se reservan palabras clave T-SQL y no deben ser utilizados para los nombres de las columnas. También tenga en cuenta que los sub-consultas no deben volver más de una fila para que esto funcione, para asegurarse de que he incluido declaraciones TOP 1.

La siguiente cosa a destacar es que los alias de columna (AS Category etc.) no son estrictamente necesarios. Su fin es lo que cuenta. Me gustaría incluirlos para facilitar la lectura, especialmente cuando la lista SELECT se hace más largo.

Otros consejos

Si se trata de una sola escritura, almacenar sus identidades en las variables:

declare MessageCategoryID int;
declare MessageStatusID int;
declare MessageLevel int;
INSERT INTO MessageCategory (Code) Values ('Cat01');
set @MessageCategoryID=scope_identity();
INSERT INTO MessageStatus (Code) Values ('Status01');
set @MessageStatudID=scope_identity();
INSERT INTO MessageLevel (Code) Values ('Level01');
set @MessageLevelID=scope_identity();

INSERT INTO Messages(Category, Status, Level, MessageText, Order) 
    VALUES(
        @MessageCAtegoryID,
        @MessageStatusID,
        @MessageLevelID,
        'Just some message',
        1);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top