0

ビューに基づいて動的に作成および設定したいテーブルが多数あります。

これら2つの投稿を組み合わせたようなものを実行したい:

ビューからテーブルを作成

カーソルを使用せずに TSQL でテーブル変数をループする方法はありますか?

Select *
Into dbo.##tblTemp
From databasename.sys.views

Declare @TableName NVARCHAR(128)

While (Select COUNT(*) From #Temp) > 0

Begin

    Select Top 1 @TableName = name from databasename.sys.views

        Select * into @TableName from databasename.sys.views

    Delete databasename.sys.views Where name = @TableName

End

テーブルを作成するための SQL ステートメントを動的に作成するストアド プロシージャの方がよいでしょうか。

編集:

Sebastian によると、これを達成するために以下のコードを実行しています。

DECLARE @cmd NVARCHAR(MAX) = ( SELECT TOP 10 'exec sp_rename '
                                    + '@objname =''' + OBJECT_SCHEMA_NAME(object_id)
                                    + '.'
                                    + OBJECT_NAME(object_id) + ''
                                    + ''', @newname = '
                                    + '''v_' + name + ''
                                    + ''';'
                                    + 'SELECT * INTO '
                                    + OBJECT_SCHEMA_NAME(object_id)
                                    + '.'                                   
                                    + OBJECT_NAME(object_id)
                                    + ' FROM '
                                    + OBJECT_SCHEMA_NAME(object_id)
                                    + '.v_'                                 
                                    + OBJECT_NAME(object_id)
                                    + ';'
                                    + 'DROP VIEW '
                                    + OBJECT_SCHEMA_NAME(object_id)
                                    + '.v_' 
                                    + OBJECT_NAME(object_id)
                                    + ';'
                            FROM db.sys.views
                            FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)');

EXEC (@cmd)
-- @cmd を選択

4

1 に答える 1

1

すべてのデータをコピーすることは、問題を解決するための間違ったアプローチのようです。問題がパフォーマンスの低下である場合は、ビューが原因で読み取りが多すぎるため、最初に注意すべきことが 2 つあります。

1) テーブルに適切なインデックスがあることを確認します。ビューにインデックスを追加することもできます。インデックス チューニングの方法を説明する多くのリソースがあります。または、コンサルタント(私のような)を雇って、それを手伝ってもらうこともできます.

2) クエリがビューを結合する場合、不要なテーブルが混在することがよくあります。たとえば、ビュー v1 がテーブル a と b を結合し、ビュー v2 がテーブル b と c を結合し、クエリが v1 を v2 と結合する場合、a と b を b と c と効果的に結合します。このようなクエリは、多くの場合、一度だけ b に結合するように書き直すことができ、パフォーマンスが大幅に向上します。したがって、ビューとビューを結合するクエリがある場合は、それらを確認する必要があります。

それでもデータのコピーを続行したい場合は、これを使用できます。

DECLARE @cmd NVARCHAR(MAX) = ( SELECT 'SELECT * INTO '
                                      + QUOTENAME(OBJECT_SCHEMA_NAME(object_id))
                                      + '.'
                                      + QUOTENAME('tbl_'+OBJECT_NAME(object_id))
                                      + ' FROM '
                                      + QUOTENAME(OBJECT_SCHEMA_NAME(object_id))
                                      + '.' + QUOTENAME(OBJECT_NAME(object_id))
                                      + ';'
                               FROM   sys.views
                               FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)');

EXEC (@cmd);     

SELECT INTO を使用してデータベース内の各ビューのテーブルを作成するコマンドを作成します。SQL Server では、異なる型のオブジェクトであっても名前の競合が許可されないため、テーブルの名前に "tbl_" というプレフィックスを付けました。

別のデータベースにテーブルを作成する必要がある場合は、テーブル名の前に " " を付ける必要がありますdbname.。その場合、「tbl_」プレフィックスを削除できます。


編集:

バージョンにいくつかの引用符がありませんでした。これを試して:

DECLARE @cmd NVARCHAR(MAX) = ( SELECT TOP 1 'exec sp_rename '''
                                + QUOTENAME(OBJECT_SCHEMA_NAME(object_id))
                                + '.'
                                + QUOTENAME(OBJECT_NAME(object_id))
                                + ''', '''
                                + QUOTENAME(OBJECT_SCHEMA_NAME(object_id))
                                + '.'
                                + QUOTENAME('v_' +OBJECT_NAME(object_id))
                                + ''';'
                                + 'SELECT * INTO '
                                + QUOTENAME(OBJECT_SCHEMA_NAME(object_id))
                                + '.'                                   
                                + QUOTENAME(OBJECT_NAME(object_id))
                                + ' FROM '
                                + QUOTENAME(OBJECT_SCHEMA_NAME(object_id))
                                + '.'                                   
                                + QUOTENAME('v_' +OBJECT_NAME(object_id))
                                + ';'
                                + 'DROP VIEW '
                                + QUOTENAME(OBJECT_SCHEMA_NAME(object_id))
                                + '.' 
                                + QUOTENAME('v_' +OBJECT_NAME(object_id))
                                + ';'
                        FROM sys.views
                        FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)');

PRINT @cmd代わりに使用EXEC(@cmd)して、まとめたコマンドが意味をなすかどうかを確認することもできます。

于 2013-01-07T21:57:46.693 に答える