sqlserver怎么能让视图更新数据库数据?求高手

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqlserver怎么能让视图更新数据库数据?求高手相关的知识,希望对你有一定的参考价值。

把问题具体说一下:
数据库之前是POSTGRE,
现在按客户需求,程序既要支持POSTGRE也要支持SQLSERVER数据库。
我现在想在不变动程序代码的情况下,只通过修改数据库使程序能在两个数据库下运行!

现在主要问题是POSTGRE支持sequence,在视图中这样用SELECT nextval('basis_id'::regclass) AS basis_seq_id;
就可以自动取到一个自加的序号。
我现在要在SQLSERVER的视图中,也要实现相同功能,SQLSERVER中没有sequence,
我创建了一个保管序号的表(区分,当前序号),当要取得一个新序号时,先查询这个表的当前序号,再把当前序号+1更新回序号表。(这个功能我做了一个存储过程)

现在是怎么在视图中,调用这个 存储过程 ?(视图中不允许使用存储过程,函数中不让更新数据库)

所以现在迷惑了,请高手指点下!

参考技术A 老弟我要挖苦你一下:
SQL 2005 以后 可以使用

多句表格值函数,

这个支持控制语句,插入更新等块操作,可以弥补视图的不足。很多人都认为可以用函数取缔
视图。

在sqlserver 社区,经常有人吵架,是要存储过程,函数,还是视图?

其次我不支持你在数据库上屏蔽差异,这个多少是奇淫技巧,如果是南天数据库,你不是要玩吐血。

就用最基本的sql92标准实现功能,屏蔽数据库差异是最好的选择。

但是你只是获得一个自增编号,写函数都浪费。

举个例子:
Declare @tb table (PName nvarchar(30) ,Code_No nvarchar(30))
insert into @tb values('P01','A')
insert into @tb values('P02','B')
insert into @tb values('P03','C')
insert into @tb values('P04','D')
insert into @tb values('P05','E')
insert into @tb values('P06','F')
SELECT
ROW_NUMBER() OVER (ORDER BY PName) as Rank,Code_No,PName
FROM @tb

--------------
返回结果:

1 A P01
2 B P02
3 C P03
4 D P04
5 E P05
6 F P06
----
这可行否?

如果是 2000 使用子查询也可轻松实现自增编号啊。追问

谢谢高手的回答!
你的这个方法,好像不能满足我,我不是要自动编号,而是取得一个自动增加的编号,来作为主键,往其它关联数据表追加数据的时候也要用到这个编号。
现在程序是这样做的,不想修改程序,就想通过修改数据库,来实现这个功能,程序一些客户已经正式开始使用了,不想因为修改程序而引发出别的问题。
现在就想用最小的修改,让程序在SQLSERVER数据库中也可以正常运行。

追答

做事变通一下!取列最大行标签+ 这个编号。

Declare @tb table (PID int ,Code_No nvarchar(30))
insert into @tb values('1','A')
insert into @tb values('2','B')
insert into @tb values('3','C')
insert into @tb values('4','D')
insert into @tb values('5','E')
insert into @tb values('6','F')
Declare @MaxID int set @MaxID=(select MAX(PID) from @tb);
SELECT
ROW_NUMBER() OVER (ORDER BY PID)+@MaxID as Rank,Code_No,PID
FROM @tb
------------------------
7 A 1
8 B 2
9 C 3
10 D 4
11 E 5
12 F 6

-------------------

在sql数据库里,其实这个就是标识列,根本不用写程序的。加一列,类型改成标识列就可以。
数据库自动帮你添加了。

本回答被提问者和网友采纳
参考技术B 那你为什么不直接写触发器呢,比如你插入一条记录时,你先不管插入的序列号

通过触发器来更新序列号追问

先谢谢你的回答!

这个序号需要取出来,其它的关联表也是需要使用的。

现在的postgre数据库的视图就是做这个用的。

追答

如果使用视图确实无法实现

oracle通过视图修改实际表怎么防止视图同步更新

参考技术A 删除其中一表数据后,视图不自动更新。
oracle全称Oracle Database,是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的、适应高吞吐量的数据库解决方案。

以上是关于sqlserver怎么能让视图更新数据库数据?求高手的主要内容,如果未能解决你的问题,请参考以下文章

索引视图更新时

SQLSERVER如何在数据库里根据某个字段,查出该表名字

SQLServer 视图问题

sqlserver创建视图

sqlserver怎么导出数据库

sqlserver的查询语句和插入更新语句怎么用