15

MySQLのバックグラウンドから来たT-SQLは少し新しいですが、構文のさまざまなニュアンスにまだ適応しています。

特定の列の後に新しい列を追加しようとしています。それが有効なキーワードであることがわかりましたAFTERが、その仕事に適したキーワードではないと思います。

ALTER TABLE [dbo].[InvStockStatus]
ADD [Abbreviation] [nvarchar](32) DEFAULT '' NOT NULL ;

これは私の現在のクエリであり、テーブルの最後にフィールドを追加することを除いて、うまく機能します。Idの [Name]に追加することをお勧めします。これを表すためにimが探している構文は何ですか?

4

8 に答える 8

25

あなたはそのようにそれをすることはできません

たとえば、このようなテーブルがある場合

create table TestTable(id1 int,id3 int)

id1とid3の間に別の列id2を追加したい場合は、デザイナーを使用する場合にSQLServerが舞台裏で行うことを次に示します。

BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_TestTable
    (
    id1 int NULL,
    id2 int NULL,
    id3 int NULL
    )  ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_TestTable SET (LOCK_ESCALATION = TABLE)
GO
IF EXISTS(SELECT * FROM dbo.TestTable)
     EXEC('INSERT INTO dbo.Tmp_TestTable (id1, id3)
        SELECT id1, id3 FROM dbo.TestTable WITH (HOLDLOCK TABLOCKX)')
GO
DROP TABLE dbo.TestTable
GO
EXECUTE sp_rename N'dbo.Tmp_TestTable', N'TestTable', 'OBJECT' 
GO
COMMIT

大量のデータがあるかどうかがわかるように、これは問題になる可能性がありますが、列がどこにあるかが重要なのはなぜですか?使用するだけ

select col1,col2,col3 from table
于 2010-06-03T17:26:30.673 に答える
7

列のシーケンスは、厳密な(機能的な)意味では実際には無関係です。どのRDBMSでも、ドキュメントや人間が見るのは「厄介」です。

SQL Serverは、列を並べ替えるT-SQLコマンドをサポートしていません。したがって、T-SQLにはこれを実現するための構文はありません。

これを変更する唯一の方法は、SSMSのビジュアルテーブルデザイナーを使用することです。これは、列を移動したり、テーブルの中央に列を挿入したりするときに、テーブル全体を最初から実際に再作成します。

于 2010-06-03T17:23:16.283 に答える
7

機能データベースの観点からは、タプルは任意の順序で表示できるのは正しいことです。

ただし、データベースは真空内には存在しません。テーブルスキーマ(dbas、devs)を読み取り、そこに向かい、それに対してクエリを維持または記述したいと思う人間は常に存在します。

以前は、テーブルの順序付けなど、テーブルの列に規則を使用していました。

  1. 最初に主キー
  2. 次に外部キー
  3. その後、頻繁に使用される列
  4. その後、他の列
  5. 最後に関連する列を監査します

これらはテーブルをスキャンするときに役立ちます。残念ながら、順序を維持するにはフープを飛び越えなければならないようです。そのため、これらの規則を維持して維持する価値があるかどうかを疑問視する必要があります。私の新しいルールは、それを最後に追加することです。

読みやすさの観点から順序が本当に心配な場合は、独自の「読みやすさ」ビューを(おそらく別のスキーマで)好きな順序で作成する必要があります。同じテーブルの複数のビューを持つことができます(1つはコア列のみ、もう1つは通常は関係のないものを含みます)。

SQL Serverデータベースダイアグラムの列を(表示のみとして)並べ替えることができれば便利ですが、これは不可能です。

于 2011-04-28T22:59:37.243 に答える
3

常に最後にのみフィールドを追加する必要があります。必要な順序でフィールドを選択する必要がありますが、中央に列を追加するために既存のテーブルを再構築しないでください。これはいくつかのことを壊す可能性があります(人々がselect *や挿入のような愚かなことをした場合、許可された列を指定せずにそれらのことをするべきではありませんが、彼らはそうします)。

テーブルの再作成は、何の利益も得られないために長い時間のかかるプロセスになる可能性があり、進行中に多くのユーザーからの苦情やロックアップを引き起こす可能性があります。

于 2010-06-03T17:26:15.027 に答える
2

私が見たスキーマ比較ツールは、目的の順序で新しいテーブルを作成し、古いテーブルから新しいテーブルにデータをコピーします(新しいテーブルを古いものに似せるための名前変更の魔法を使用して)。このアプローチがいかに厄介であるかを考えると、特定の場所に新しい列を追加するためのT-SQLステートメントはないと思います。

于 2010-06-03T17:24:42.090 に答える
1

技術的に、またはおそらく学術的には、列がテーブルに追加される順序、または列がデータベースの内部ストレージモデルに格納される順序は関係ありません。SQLクエリのSelect句に列をリストするだけで、実行するクエリの出力に列または計算式が表示される順序を制御できます。内部的には、データベースは、ストレージを最適化するのに適していると思われる方法で実際のデータを自由に保存したり、データ要素をディスクやメモリの境界に合わせるのに役立ちます。

于 2010-06-03T17:25:52.673 に答える
1

これは、一時テーブルを使用せずに安全に回避できます。列を最後に追加したら、SQL SeverManagementStudioに移動します。テーブルをクリックし、->デザイン(または変更)を選択して、最後の列を目的の位置にドラッグします

このようにして、データとインデックスが失われることを心配する必要はありません。他の唯一のオプションは、テーブルを再作成することです。これは、大きなデータがある場合に問題になる可能性があります。

この回答は他の人を助けるためのものであり、回答として受け入れられることを意図したものではありません。

于 2011-06-23T21:30:01.570 に答える
0

この質問が投稿されてからかなりの時間が経過しましたが、特定の順序で列を配置するための基になる生のSQLコードは、スクリプトを生成するプロセスを変更していませんが、次のことを選択した場合は処理されます。 VisualStudio内のSQLServerデータツールを使用してデータベースを管理します。デプロイ先のデータベースには、プロジェクトで指定した順序で常に列があります。

于 2015-01-19T04:34:22.780 に答える