0

データベース内の同様の名前のテーブルから行を挿入するカーソルからテーブルを作成することができました。正常に機能しましたが、元のクエリを更新する必要がないようにビューを作成したいと思います。カーソルを使用して間違ったルートをたどっている可能性がありますが、現在のクエリは次のとおりです。

use LaganPDM
set nocount on 
declare @table varchar(128)
declare @cmd varchar(500) 
create table SPECIAL_CASE_FORMS_2 (table_name varchar(128), flods_id numeric(22,0) PRIMARY KEY, lgncc_id numeric(22,0), case_enquiry_id numeric(22,0),amount varchar(4000), costcode varchar(4000), jobcompletedate varchar(4000), jobreleasedate varchar(4000),paymentstatus varchar(4000))
declare tables cursor for
select table_name
from information_schema.tables
   where table_name like '%SPECIAL_UP_C00%'
and left(right(table_name, 24),9) > '101000363'
and not left(right(table_name, 24),9) in('101000487', '101000507', '101000510')
open tables
fetch next from tables into @table
while @@fetch_status = 0
begin
  set @cmd = 'select ''' + @table + ''', * from ' + @table 
insert into SPECIAL_CASE_FORMS_2 exec (@cmd)
  fetch next from tables into @table
END
CLOSE tables 
DEALLOCATE tables
select  * from SPECIAL_CASE_FORMS_2

これを適応させてビューを作成しようとしましたが、うまくいきません。これが別のルートをたどることを意味するとしても、どんな提案もありがたく受け取られます。

ありがとう!

4

2 に答える 2

0

カーソルよりもCTEの方が適していると思うので、これを試してみてください

use LaganPDM 

Create view as [dbo].[test]
With cteTables as (
select
*
from 
information_schema.tables 
where table_name like '%SPECIAL_UP_C00%' and left(right(table_name, 24),9) > '101000363' and not left(right(table_name, 24),9) in('101000487', '101000507', '101000510'))
Select
* -- because it's a view, you'll have to list all the columns instead of just using select *
From
CteTables

ただし、CTE に関する警告の言葉は、大量のレコードを処理する場合にパフォーマンスの問題が発生する可能性があるため、そのことを念頭に置いてください。

于 2016-10-30T00:43:07.397 に答える
0

コメントで既に述べたように、カーソルはビューでは使用できず、ストアド プロシージャでのみ使用できます。

新しいテーブルがデータベースに追加されるたびに自動的に更新されるテーブルにクエリの結果を取得するには、次の操作を実行できます。

まず、データベースで指定された永続テーブルを既に作成してSPECIAL_CASE_FORMS_2います。
このテーブルは既存のレポートに使用できるため、頻繁に更新されていることを確認する必要があります。
クエリが実行されるたびにテーブルを作成する必要さえありません...データベースに手動で一度作成しcreate table、クエリの最初の行を次のように置き換えます。

delete from SPECIAL_CASE_FORMS_2

さらに、最後に次の行を削除できます。

select  * from SPECIAL_CASE_FORMS_2

ここで、クエリを実行するSQL Server エージェント ジョブを作成します。完全なクエリを「コマンド」フィールド
に貼り付けるか、クエリをストアド プロシージャとして保存し、ストアド プロシージャをジョブで実行することができます。(私は後者を好みます。その方法では、実際のコードがテーブルと同じデータベースにあり、SQL Server エージェント ジョブがシステム データベースに保存されるからです)
msdb

1 日に 1 回実行されるようにジョブをスケジュールします。

それでおしまい!

これで、ジョブは 1 日 1 回テーブルを削除して再入力しSPECIAL_CASE_FORMS_2、すべてのレポートでそのテーブルを使用できるようになりました。
新しいテーブルがデータベースに追加されると、そこからのデータはSPECIAL_CASE_FORMS_2翌日にもテーブルに含まれます。
(翌日よりも早く必要な場合は、1 日に数回実行されるように SQL Server エージェント ジョブをスケジュールするだけです)

さらに、事前入力されたテーブルからデータを取得するだけなので、レポートはこの方法でより高速に実行されます。
上記のクエリは複数のテーブルをループし、データを新しいテーブルに挿入するため、レポートごとにこれを繰り返すと処理が遅くなり、データベースに大きな負荷がかかります。

于 2012-06-29T17:15:03.777 に答える