6

このクエリをどのような方法で実行できますか?

delete from sys.tables where is_ms_shipped = 0

何が起こったのか、私は非常に大きなクエリを実行し、その上にディレクティブを置くのを忘れましUSEた。今ではマスターデータベースに無数のテーブルがあり、それらを1つずつ削除したくありません。

更新:これはまったく新しいデータベースなので、以前のデータを気にする必要はありません。達成したい最終的な結果は、マスターデータベースを工場出荷時にリセットすることです。

4

7 に答える 7

7

これが1回限りの問題である場合は、SQL ServerManagementStudioを使用してテーブルを削除してください。

スクリプトを非常に実行する必要がある場合は、次のように慎重に使用してください。

EXEC sp_msforeachtable 'DROP TABLE ?'
于 2011-01-10T01:35:15.407 に答える
3

私が過去に使用した非常に単純で比較的確実な方法の1つは、システムテーブル/情報スキーマ(正確な要件に応じて)をクエリし、実行するコマンドのリストを結果セットとして出力することです。それを確認し、コピーして貼り付け、実行します。1回限りの作業ですばやく簡単に実行できます。破壊的なビットのボタンを手動で押しているので、誤ってゴミ箱に捨てるのは(IMHO)困難です。

例えば:

select 'drop table ' + name + ';', * from sys.tables where is_ms_shipped = 0
于 2011-01-10T12:25:26.050 に答える
2

バックアップはありませんか?:-)

1つのアプローチは、最初のデータベースインポートを使用してVisualStudioでデータベースプロジェクトを作成することです。次に、テーブルを削除し、プロジェクトをデータベースに同期します。コミットフェーズとUIで「バッファリング」しながら、このアプローチで一括削除を実行できます。

上記のアプローチを使用して、テーブルの関係も処理できると確信しています(ただし、マスター」スペースでは試していません)。また、VS DBプロジェクト(またはスキーマの比較と同期を可能にする他のデータベース管理ツール)を使用して、将来の作業を容易にし、バージョン対応(SCMなど)のスキーマ変更追跡を可能にすることをお勧めします。

ああ、そして何が行われたとしても、最初にバックアップを作成してください。他に何もないとしても、それは良いトレーニングです:-)

于 2011-01-10T02:53:05.177 に答える
1

私がした最も簡単で最短の方法はこれでした:

SQLServer2008でシステムデータベースを再構築する方法

ここでの他のすべての回答の問題は、関連するテーブルがあり、実行を拒否するため、機能しないことです。

これは、機能するだけでなく、実際に私が探しているものです。質問で述べられているように、「工場出荷時のデフォルトにリセット」です。
また、これはテーブルだけでなくすべてを削除します。

于 2011-01-10T03:48:49.840 に答える
1

このコードの方が良いかもしれませんが、私はそれを書いている間、用心深くしようとしていました。テーブルを削除する前に、テストのための簡単な調整に従うのは簡単だと思います。

DECLARE 
    @Prefix VARCHAR(50),
    @TableName NVARCHAR(255),
    @SQLToFire NVARCHAR(350)

SET @Prefix = 'upgrade_%'

WHILE EXISTS(
    SELECT
        name
    FROM
        sys.tables
    WHERE
        name like @Prefix
    )
BEGIN
    SELECT
        TOP 1   --This query only iterates if you are dropping tables
        @TableName = name
    FROM
        sys.tables
    WHERE
        name like @Prefix

    SET @SQLToFire = 'DROP TABLE ' + @TableName

    EXEC sp_executesql @SQLToFire;
END
于 2011-11-01T12:32:40.333 に答える
1

私は本当に似たようなことをしました。結局、タスク->スクリプトデータベースを使用して、元々意図されていたデータベースのすべてのデータベースオブジェクトのスクリプトドロップのみを実行しました。私が実行した巨大なスクリプトを実行することになっていたデータベースを意味します。必ず詳細オプションにIFExistsを含めてから、マスターとBAMに対してそのスクリプトを実行し、マスターにも存在する元のターゲットデータベースに存在するすべてのものを削除して、元のマスターアイテムであるはずの違いを残します。

于 2011-12-28T15:16:02.583 に答える
0

あまりエレガントではありませんが、これは1回限りの作業です。

WHILE EXISTS(SELECT * FROM sys.tables where is_ms_shipped = 0) 
      EXEC sp_MSforeachtable 'DROP TABLE ?'

この単純なテストで正常に機能します(a最初の試行で失敗した後、2番目のループでクリアし、削除に進みますb

create table a
(
a int primary key
)
go

create table b
(
a int references a (a)
)

insert into a values (1)

insert into b values (1)
于 2011-01-10T02:55:55.117 に答える