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

正如评论中已经说过的,您不能在视图中使用游标,只能在存储过程中使用。

要将查询结果放入每次将新表添加到数据库时自动更新的表中,您可以执行以下操作:

首先,您已经在数据库中创建了一个名为的永久表SPECIAL_CASE_FORMS_2
您可以将此表用于现有报告,因此您需要确保它经常更新。
您甚至不需要在每次执行查询时创建表......只需在数据库中手动创建一次,然后将create table查询开头的行替换为:

delete from SPECIAL_CASE_FORMS_2

另外,您可以在最后删除此行:

select  * from SPECIAL_CASE_FORMS_2

现在创建一个执行查询的 SQL Server 代理作业。
您可以将完整的查询粘贴到“命令”字段中,也可以将查询保存为存储过程并在作业中执行存储过程。
(我更喜欢后者,因为这样,实际代码与表在同一个数据库中 - SQL Server 代理作业保存在msdb系统数据库中)

安排作业,使其每天运行一次。

而已!

现在,该作业将每天删除并重新填充SPECIAL_CASE_FORMS_2一次表格,您可以在所有报告中使用该表格。
如果将新表添加到数据库中,则该SPECIAL_CASE_FORMS_2表中的数据也会在第二天出现在表中。
(如果您在第二天之前需要它,只需安排 SQL Server 代理作业,使其每天运行几次)

此外,您的报告会以这种方式运行得更快,因为它们只是从预先填充的表格中获取数据。
您上面的查询循环遍历多个表并将数据插入到一个新表中,因此对每个报告再次执行此操作会更慢并导致数据库负载更大。

于 2012-06-29T17:15:03.777 回答
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 回答