Вопрос

У меня есть четыре столика:Сообщения, категория сообщений, MessageStatus и MessageLevel.

MessageCategory, MessageStatus и MessageLevel содержат всего три поля:Идентификатор (первичный ключ), Код и Описание.Сообщения относятся к этим трем полям и содержат несколько других полей данных, включая Идентификатор (первичный ключ) MessageText и Order.Поля идентификации являются полями с автоматическим увеличением.

Теперь мне нужно написать SQL-скрипт, чтобы добавить некоторые данные по умолчанию во все четыре таблицы.Проблема в том, что мне нужно создать скрипт, который будет отправлен клиенту, который затем выполнит этот скрипт.Я не могу написать немного более интеллектуальный код, чтобы выполнить полное обновление.И хотя три таблицы - это всего лишь простые инструкции insert, именно таблица Messages вызывает у меня дополнительную головную боль.

Я не могу удалить какие-либо индексы, и я не могу предположить, что он начинает отсчет с 1 для первичных ключей.

Итак, в качестве примера, у нее есть некоторые данные:

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

И сообщения должны были бы содержать что-то вроде этого:

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
);

Однако это не сработает.Итак, в чем хитрость, чтобы это сработало?(Сохраняя код читабельным тоже ...)

К сожалению, у меня нет доступа к другой базе данных.Я могу протестировать это, но как только кажется, что это сработает, остается только отправить и молиться, чтобы это сработало...

Это было полезно?

Решение

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]

Вышесказанное будет работать для SQL Server.Обратите внимание, что оба Identity и Order являются зарезервированными ключевыми словами T-SQL и не должны использоваться для имен столбцов.Также обратите внимание, что подзапросы не должны возвращать более одной строки, чтобы это сработало, чтобы гарантировать, что я включил TOP 1 заявления.

Следующее, на что следует обратить внимание , это то , что псевдонимы столбцов (AS Category и т.д.) не являются строго необходимыми.Их порядок - вот что имеет значение.Я бы включил их для удобства чтения, особенно когда список ВЫБОРА становится длиннее.

Другие советы

Если это один скрипт, сохраните ваши идентификаторы в переменных:

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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top