关闭

如何向视图插入数据

6885人阅读 评论(0) 收藏 举报
分类:


/*
drop table a
drop table b
go
*/

create table A(ID int identity(1,1) primary key,Avalue varchar(10))
create table B(ID int identity(1,1) primary key,AID int,Bvalue varchar(10))
go


/*
drop view AB_view
go
*/


create view AB_view
as
select A.*, B.Bvalue from A join B on (A.ID = B.AID)
go
 

--drop trigger  AB_tr on AB_view
 
create trigger AB_tr on AB_view instead of insert
as
begin

insert into a(Avalue)
select Avalue
from 
(
select distinct id,Avalue
from inserted i
)t

insert into b(aid,Bvalue)
select  scope_identity(),Bvalue
from inserted i

end
go

 

insert into AB_view (Avalue, Bvalue) values ('A3', 'B3')


select * from a
/*
ID	Avalue
1	A3
*/

select * from b
/*
ID	AID	Bvalue
1	1	B3
*/


/*
--建立2个表
create table t1(id int not null primary key,tbl varchar(5) not null)

create table t2(id int not null primary key,tbl varchar(5) not null)

go


--插入数据
insert into t1
select object_id,'01'
from sys.objects

insert into t2
select OBJECT_ID ,'02'
from sys.objects

if exists(select * from sys.views where name = 'v_t')
   drop view v_t
go


--创建视图
create view v_t
as

select * from t1
union all
select * from t2
go

*/



if exists(select * from sys.triggers where name = 'trigger_t')
   drop trigger dbo.trigger_t
go

--1.通过判断区分列tbl的值是'01'或'02',把数据分别插入t1或t2   
create trigger dbo.trigger_t
on dbo.v_t
instead of insert
as

declare @t varchar(8);
set @t = '';


if @t = '01'
	insert into dbo.t1
	select * from inserted
else 
    insert into dbo.t2
    select * from inserted

go


--1.测试
insert into v_t
select 115,'02'

select *
from dbo.t2
where ID = 115



if exists(select * from sys.triggers where name = 'trigger_t')
   drop trigger dbo.trigger_t
go

--2.通过判断区分列tbl的值是'01'或'02',来动态生成语句实现插入数据 
create trigger dbo.trigger_t
on dbo.v_t
instead of insert
as

declare @t varchar(8);
declare @sql varchar(max);
declare @id int ;
set @t = '';

select @t = tbl,@id = ID
from inserted

set @sql = 'insert into dbo.t' + RIGHT(@t,1) + 
           '(id,tbl) values(' +
           + CAST(@id as varchar) + ',''' + @t +''')' 

exec(@sql)

go


--2.测试
insert into v_t
select 116,'01'

select *
from dbo.t1
where ID = 116



if exists(select * from sys.triggers where name = 'trigger_t')
   drop trigger dbo.trigger_t
go

--3.前两种是通过insted of触发器来实现的,接下来通过check约束来实现

--先删除原来的主键,因为分区列必须包含在主键中
alter table t1 
drop constraint PK__t1__3213E83F7F60ED59

--可以不加check约束,但会导致查询优化器必须要搜索所有的表
--加了check约束后,会直接搜索符合分区依据列的表.
alter table t1
add constraint ck_t1_tbl check(tbl='01')

--加上主键约束
alter table t1
add constraint pk_t1 primary key(id,tbl)


alter table t2
drop constraint PK__t2__3213E83F03317E3D

alter table t2
add constraint ck_t2_tbl check(tbl='02')

alter table t2
add constraint pk_t2 primary key(id,tbl)


--3.测试
insert into v_t
select 12345,'01'

select *
from dbo.t1
where ID = 12345



--4.建立索引视图

if exists(select * from sys.views where name = 'v_t')
   drop view v_t
go


--创建视图
--必须加上架构,以及明确指定列
create view dbo.v_t
with schemabinding
as

select ID,tbl from dbo.t1
union all
select id,tbl from dbo.t2

go


select * from v_t


/*
报错:

消息 10116,级别 16,状态 1,第 1 行
无法对视图 'WC.dbo.v_t' 创建 索引,
因为其中包含一个或多个 UNION、INTERSECT 或 EXCEPT 运算符。
如果将查询作为原始视图的 UNION、INTERSECT 或 EXCEPT 运算符的输入,
请考虑为每个这样的查询创建一个单独的索引视图。

说明当视图中有union all时,无法建立索引视图
*/
create unique clustered index idx_v_t on dbo.v_t(id)


0
0
查看评论

向视图中插入数据的方法

<br />插入视图的条件: <br />  1.如果视图是基于一个基础表产生的,那么这就称为非连接视图,所有的非连接视图都是可以更新的,也就是说可以在该视图上进行,INSERT,UPDATE,DELETE的操作.<br />  2.如果是连接视图,那就要遵守基本...
  • tianlincao
  • tianlincao
  • 2011-02-14 11:35
  • 1555

视图的INSERT、UPDATE、DELETE注意事项

对视图进行INSERT操作必须要满足以下两个条件: ①该视图必须是行列子集视图 ②所有非空且无默认值的列都必须出现在该行列子集视图中 不能执行INSERT的视图可能具有以下某个特征: ①视图定义中有GROUP BY DISTINCT INTO COMPUTE 临时表或聚集函数 ②视图定义中...
  • LI_ANGGEZI
  • LI_ANGGEZI
  • 2013-09-04 17:42
  • 1823

SqlServer视图数据的增删改查

视图是用于查询的另外一种方式。 与实际的表不同,它是一个虚表;因此数据库中只存在视图的定义,而不存在视图中相对应的数据,数据仍然存放在原来的基本表中。视图是一种逻辑对象。
  • qq_31156277
  • qq_31156277
  • 2017-09-13 00:09
  • 2129

关于SQL视图的创建和使用方法

SQL视图的创建和使用 视图这个东西在其他的软件中,我们也经常看得到,例如word中就有视图,我们不难发现,视图似乎是一种显示方式,就像WORD一样,有几种显示版面,这就是视图,那么SQL中的视图又该怎么定义呢?今儿我要学习一下,做个笔记。这是在继SQL数据库高级查询和子查询之后的又一个重要内容。...
  • lefter1986
  • lefter1986
  • 2013-09-03 14:29
  • 50991

能否向Mysql视图中插入/更新/删除数据

原文链接:http://blog.sina.com.cn/s/blog_8edc37a80101c4ba.html 要通过视图更新基本表数据,必须保证视图是可更新视图,即可以在INSET、UPDATE或DELETE等语句当中使用它们。对于可更新的视图,在视图中的行和基表中的行之间必须具有一对一的关...
  • nimeijian
  • nimeijian
  • 2016-07-19 19:39
  • 7382

OCP-1Z0-051 第42题 视图的注意事项

一、原题 Which three statements are true regarding views? (Choose three.) A. Views can be created only from tables. B. Views can be created from tables...
  • hollo_hhy
  • hollo_hhy
  • 2014-05-06 13:17
  • 2905

OCP-1Z0-051 第38题 视图注意事项

一、原题 Which two statements are true regarding views? (Choose two.) A. A simple view in which column aliases have been used cannot be updated. B. Row...
  • hollo_hhy
  • hollo_hhy
  • 2014-05-05 23:19
  • 3659

SQL-使用视图

什么是视图?它们怎样工作?何时使用它们?如何利用视图简化执行的某些SQL操作?1. 使用视图的原因 A. 重用SQL语句。 B. 简化复杂的SQL操作。在编写查询后,可以方便地重用它而不必知道其基本查询。 C. 使用表的一部分而不是整个表。 D. 保护数据。可以授予用户访问表的...
  • beauty_1991
  • beauty_1991
  • 2016-04-19 16:40
  • 6365

如何向视图插入数据

/* --建立2个表 create table t1(id int not null primary key,tbl varchar(5) not null) create table t2(id int not null primary key,tbl varchar(5) not null) ...
  • yupeigu
  • yupeigu
  • 2013-08-31 12:55
  • 6885

T-SQL视图操作

视图:是从一个或多个表中使用SELECT的FROM子句导出的。那些用来导出视图的表称为基表,视图也可以从一个或多个其他视图中产生。导出视图的SE LECT语句存放在数据库中,而与视图定义相关的数据并没有在数据库中另存一份,所以视图也称为虚表,通过视图看到的是它所基于的表的数据。视图的行为如同一个表,...
  • qq719365064
  • qq719365064
  • 2016-10-25 17:44
  • 82
    个人资料
    • 访问:526306次
    • 积分:9035
    • 等级:
    • 排名:第2474名
    • 原创:362篇
    • 转载:14篇
    • 译文:1篇
    • 评论:137条
    博客专栏
    最新评论