我已成功地从游标创建了一个表,该游标从数据库中具有类似名称的表插入行。它工作成功,但我希望创建一个视图,这样我就不需要更新原始查询。我可能使用游标走错了路,但我的当前查询是:
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
我试着去适应它并创造一个观点,但是我没有运气。任何建议都将被感激地接受,即使这意味着走上一条不同的道路。
谢谢!
2条答案
按热度按时间rqqzpn5f1#
正如在注解中已经说过的,您不能在视图中使用游标,只能在存储过程中使用。
若要将查询结果保存到表中,并在每次向数据库添加新表时自动更新该表,可以执行下列操作:
首先,您已经在数据库中创建了一个名为
SPECIAL_CASE_FORMS_2
的永久表。您可以将此表用于现有的报表,因此您所需要确保的只是它经常更新。
您甚至不需要在每次执行查询时都创建表...只需在数据库中手动创建一次,并将查询开头的
create table
行替换为:另外,您可以删除末尾的以下行:
现在create a SQL Server Agent job执行您的查询。
您可以将完整的查询粘贴到the "Command" field中,也可以将查询保存为存储过程,然后在作业中执行该存储过程。
msdb
系统数据库中)*计划作业,使其每天运行一次。
就是这样!
现在,该作业将每天删除并重新填充
SPECIAL_CASE_FORMS_2
表一次,您可以在所有报告中使用该表。如果向数据库中添加了新表,则该表中的数据在第二天也会出现在
SPECIAL_CASE_FORMS_2
表中。另外,您的报表将以这种方式运行得更快,因为它们只是从预填充的表中获取数据。
上面的查询循环遍历几个表并将数据插入到一个新表中,因此对每个报表重复执行该操作会比较慢,并会导致数据库负载增加。
nwnhqdif2#
我觉得CTE比光标更合适,所以可以试试这个
关于CTE的警告,如果您正在处理大量的记录,它可能会有性能问题,所以请记住这一点。