3

SQL Server 2008 R2 を実行し、新しいデータベース (後でオフラインにして別の場所に保存できる) を作成するアーカイブ機能を作成し、プライマリ データベースからデータを取り出して新しい DB に入れ、最後に作成します。新しいテーブルでアーカイブされたデータを確認するためのプライマリ DB のビュー。

DBを作成し、新しいDBにアーカイブテーブルを作成し、プライマリDBからレコードをコピーしてアーカイブDBに入れ、プライマリDBからレコードを削除するスクリプトがあります。今、私はビューの作成をスクリプト化しようとしています:

declare @sql varchar(8000)
set @sql = 'create view [' + @srcdb + '].[dbo].[vw_artrans] as 
            select * from [' + @srcdb + '].[dbo].artrans
            union
            select * from [' + @archdb + '].[dbo].artrans'
exec (@sql)

ただし、DB の名前を渡してビューを作成することはできません。

だから私は代わりにこれを試しました:

declare @sql varchar(8000)
set @sql = 'use ' + @srcdb + ' 
            go
            create view [vw_artrans] as 
            select * from [' + @srcdb + '].[dbo].artrans
            union
            select * from [' + @archdb + '].[dbo].artrans'
exec (@sql)

しかし、今では GO ステートメントについて不平を言っています ( Incorrect syntax )。

アーカイブされたデータ用に作成されるデータベースの名前は、スクリプトで動的に決定される (@archdb名前を含む) ため、DB 名でスクリプトを作成できず、2 番目のスクリプトを実行できません。

4

2 に答える 2

5

@Sebastienの回答に基づいて、これが解決策です:

declare @sql varchar(8000)

set @sql = 'EXEC ' + @srcdb + '.sys.sp_executesql N''create view [vw_artrans] as 
            select * from [' + @srcdb + '].[dbo].artrans
            union
            select * from [' + @archdb + '].[dbo].artrans'';'

exec (@sql)
于 2013-03-14T17:21:16.947 に答える
3

現在のデータベースとは異なるデータベースで動的 SQL ステートメントを実行するには、次のように sp_executesql を使用できます。

USE db1;
EXEC db2.sys.sp_executesql N'SELECT DB_NAME();';

これにより、db2 が返されます。

GOは T-SQL ステートメントではありません。SSMS によって解釈され、クエリ テキストがバッチに分割されます。SQL Server 自体に送信されることはありません。

于 2013-03-14T17:05:01.683 に答える