0

やりたいことをどのように説明するかわかりませんが、とにかく試してみます。XYZとbckXYZという2つのテーブルがあります。bckXYZは、XYZ用に作成されたバックアップテーブルです。それらは同じ列を持っていますが、列の順序は同じではありません。XYZでトリガー(アスタリスク付き)を作成すると、SQLで列の順序に関連するエラーが発生します。私が言ったように、それらの列は同じですが、順序は異なります!

2つのオプションがあります。アスタリスクを使用する代わりに、列名を1つずつselectスクリプトに入れるか、bckXYZのスキーマをXYZとして変更します。

質問1:トリガーに同じ列順序が必要なのはなぜですか?ばかげていますか?

質問2:私がする必要があるのは、スキーマを同じように見せることです。そのため、それを実行できるスクリプトはありますか?

動作しません

ALTER TRIGGER [dbo].[XYZ_Ins]
ON [dbo].[XYZ]
FOR  INSERT

AS
INSERT INTO dbo.bckXYZ 
SELECT    inserted.*
FROM         inserted

できます

ALTER TRIGGER [dbo].[XYZ_Ins]
ON [dbo].[XYZ]
FOR  INSERT

AS
INSERT INTO dbo.bckXYZ (a,b,c,d,e)
SELECT    (a, b, c, d, e)
FROM         inserted
4

1 に答える 1

1

質問1:トリガーに同じ列順序が必要なのはなぜですか?ばかげていますか?

いいえ、ばかげているわけではありません。コマンドの一部を形成するステートメントでは列名は必要ありません(列は計算され、名前が付けられていない場合があります)。(この場合)続行する必要があるのは、列の順序だけです。selectINSERT ... SELECT

質問2:私がする必要があるのは、スキーマを同じように見せることです。そのため、それを実行できるスクリプトはありますか?

テーブル内の列を再配置するSQLコマンドはありません。テーブル内の列の順序を変更したい場合は、変更できません。たとえばSSMSを使用する場合、舞台裏では、調整されたレイアウトで新しいテーブルを作成し、すべてのデータをコピーし、古いテーブルを削除して、新しいテーブルの名前を変更します。


そうは言ってもINSERT ... SELECT、2つのテーブルの列の順序が同じであっても、ステートメントに明示的な列名を書き出すことになります。私が快適な場所は、a)テストselect *EXISTS()、およびb)使い捨て/スクラッチクエリ内だけです。

于 2012-06-27T07:59:53.200 に答える