2012-06-29 3 views
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 

하지만 운이없는입니다. 이것이 다른 경로로 넘어가 더라도 어떤 제안이라도 감사하게 받아 들여질 것입니다.

감사합니다.

+5

왜 이것이보기 여야합니까? –

+3

뷰는 미리 정의 된 쿼리이므로 루프, 커서와 같은 프로그래밍 방식의 논리를 사용할 수 없습니다. –

+0

Thx 얘들 아. 꼭 필요한 것은 아닌지 잘 모르겠다. 기존 보고서에 가입 할 수있는 쿼리를 작성하기를 원했기 때문에 언제든지 업데이트 할 필요가 없다. 새 테이블 (이와 비슷한 이름) 가 데이터베이스에 추가되면 내 쿼리가 자동으로이를 선택하여 테이블에 추가합니다. – user1354015

답변

0

이미 주석에서 언급했듯이 저장 프로 시저에서만 뷰에서 커서를 사용할 수 없습니다.

첫째, 당신은 이미 SPECIAL_CASE_FORMS_2라는 이름의 영구 테이블을 만들 :

가 자동으로 새 테이블이 데이터베이스에 추가 될 때마다 업데이트되는 테이블에 쿼리의 결과를 얻으려면, 다음은 할 수 데이터베이스
기존 보고서에이 표를 사용할 수 있으므로 자주 업데이트되어야합니다.
심지어 단지 수동으로 데이터베이스에 한 번 만들 ... 테이블을 쿼리가 실행될 때마다 작성해야이와 쿼리의 시작 부분에 create table 라인을 대체하지 않습니다

delete from SPECIAL_CASE_FORMS_2 

게다가, 당신은 마지막에이 줄을 삭제할 수 있습니다

select * from SPECIAL_CASE_FORMS_2 

을 이제 쿼리를 실행 create a SQL Server Agent job을.
전체 쿼리를 the "Command" field에 붙여 넣거나 쿼리를 저장 프로 시저로 저장하고 해당 작업에서 저장 프로 시저 만 실행할 수 있습니다.
(그 방법은, 실제 코드는 테이블과 같은 데이터베이스에 있기 때문에 나는 후자를 선호 - SQL Server 에이전트 작업이 msdb 시스템 데이터베이스에 저장됩니다)

일정 작업이 실행되도록 하루에 한 번.

그게 전부 야!

이제 작업이 하루에 한 번 SPECIAL_CASE_FORMS_2 테이블을 삭제하고 다시 채우며 모든 보고서에서 해당 테이블을 사용할 수 있습니다.
새 테이블이 데이터베이스에 추가되면 그 테이블의 데이터는 다음 날 SPECIAL_CASE_FORMS_2 테이블에도 있습니다.
(이전에 다음 날 이상을 필요로하는 경우는 하루에 여러 번 실행되도록 바로 SQL Server 에이전트 작업을 예약) 그들은 단지 데이터를 얻을 수 있기 때문에

또한, 보고서는 빨리 이런 식으로 실행됩니다 미리 채워진 표에서
위의 쿼리는 여러 테이블을 반복하고 새 테이블에 데이터를 삽입하므로 각 보고서에 대해 다시 수행하면 데이터베이스에 더 많은 부하가 발생할 수 있습니다.

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는 커서보다 더 적합하다고 생각 마음.

관련 문제