3

Messages、MessageCategory、MessageStatus、MessageLevel の 4 つのテーブルがあります。

MessageCategory、MessageStatus、および MessageLevel にはすべて、Identity (主キー)、Code、および Description の 3 つのフィールドしかありません。Messages はこれら 3 つのフィールドを参照し、Identity (主キー) MessageText と Order を含む他のいくつかのデータ フィールドを持ちます。ID フィールドは自動インクリメント フィールドです。

ここで、SQL スクリプトを作成して、4 つのテーブルすべてに既定のデータを追加する必要があります。問題は、このスクリプトを実行する顧客に送信されるスクリプトを作成する必要があることです。更新全体を行うために、もう少しインテリジェントなコードを書くことはできません。3 つのテーブルは単純な挿入ステートメントに過ぎませんが、さらに頭を悩ませているのは 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
);

しかし、それはうまくいきません。それで、これを機能させるためのトリックは何ですか?(コードを読みやすくすることも...)

残念ながら、他のデータベースにはアクセスできません。私はそれをテストすることができますが、動作するように見えたら、送信して動作するように祈るだけです...

4

2 に答える 2

6
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など) は厳密には必要ないということです。それらの順序が重要です。特に SELECT リストが長くなる場合は、読みやすくするためにそれらを含めます。

于 2009-10-19T11:42:39.557 に答える
4

単一のスクリプトの場合は、ID を変数に保存します。

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);
于 2009-10-19T11:46:48.863 に答える