【问题标题】:create view with cursor or loop使用光标或循环创建视图
【发布时间】:2012-07-01 02:39:04
【问题描述】:

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

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

我已尝试对此进行调整并创建一个视图,但没有运气。任何建议都将不胜感激,即使这意味着走不同的路线。

谢谢!

【问题讨论】:

  • 为什么这需要是一个视图?
  • 视图是预定义的查询,不能使用循环、游标等编程逻辑。
  • 谢谢各位。我不确定它是否一定,我只是希望生成一个可以加入我现有报告的查询,所以我不需要随时更新它 - 每次都有一个新表(使用这个相似的名称)被添加到数据库中,我的查询会自动选择它并将其添加到表中。

标签: sql sql-server tsql sql-server-2005


【解决方案1】:

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

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

首先,您已经在数据库中创建了一个名为 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代理作业,使其每天运行多次)

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

【讨论】:

    【解决方案2】:

    我觉得 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 的警告,但如果您处理大量记录,它可能会出现性能问题,因此请记住这一点。

    【讨论】:

      猜你喜欢
      • 2016-10-30
      • 2015-07-10
      • 1970-01-01
      • 2012-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-03
      相关资源
      最近更新 更多