Sql 使用光标或循环创建视图

Sql 使用光标或循环创建视图,sql,sql-server,tsql,sql-server-2005,Sql,Sql Server,Tsql,Sql Server 2005,我已经设法从一个游标创建了一个表,该游标插入了数据库中类似命名表的行。它成功地工作了,但是我想创建一个视图,这样我就不需要更新我的原始查询。我可能使用光标走错了方向,但我当前的查询是: 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 nume

我已经设法从一个游标创建了一个表,该游标插入了数据库中类似命名表的行。它成功地工作了,但是我想创建一个视图,这样我就不需要更新我的原始查询。我可能使用光标走错了方向,但我当前的查询是:

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
我试着去适应它并创建一个视图,但是我没有运气。任何建议都会被感激地接受,即使这意味着要走另一条路


谢谢

如评论中所述,不能在视图中使用游标,只能在存储过程中使用

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

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

delete from SPECIAL_CASE_FORMS_2
此外,您还可以在末尾删除此行:

select  * from SPECIAL_CASE_FORMS_2
现在,它将执行您的查询。 您可以将完整查询粘贴到中,也可以将查询另存为存储过程,然后在作业中执行存储过程。 我更喜欢后者,因为这样,实际代码与表位于同一数据库中—SQL Server代理作业保存在msdb系统数据库中

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

就这样

现在,作业将每天删除并重新填充一次SPECIAL_CASE_FORMS_2表,您可以在所有报告中使用该表。 如果向数据库中添加了一个新表,那么第二天来自该表的数据也会出现在特殊情况表单2表中。 如果您在第二天之前需要它,只需安排SQL Server代理作业,使其每天运行几次即可

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

我认为CTE比cursor更合适,所以不妨尝试一下

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的警告,如果你要处理大量的记录,它可能会有性能问题,所以请记住这一点。

为什么这需要是一个视图?视图是一个预定义的查询,你不能使用循环、游标等编程逻辑。Thx伙计们。我不确定它是否必要,我只是希望生成一个查询,我可以将现有的报告加入其中,这样我就不需要在任何时候更新它-每次将具有类似名称的新表添加到数据库中时,我的查询都会自动拾取该表并将其添加到表中。