sqlserver怎么能让视图更新数据库数据?求高手
把问题具体说一下:数据库之前是POSTGRE,现在按客户需求,程序既要支持POSTGRE也要支持SQLSERVER数据库。我现在想在不变动程序代码的情况下,只通过修改数据...
把问题具体说一下:
数据库之前是POSTGRE,
现在按客户需求,程序既要支持POSTGRE也要支持SQLSERVER数据库。
我现在想在不变动程序代码的情况下,只通过修改数据库使程序能在两个数据库下运行!
现在主要问题是POSTGRE支持sequence,在视图中这样用SELECT nextval('basis_id'::regclass) AS basis_seq_id;
就可以自动取到一个自加的序号。
我现在要在SQLSERVER的视图中,也要实现相同功能,SQLSERVER中没有sequence,
我创建了一个保管序号的表(区分,当前序号),当要取得一个新序号时,先查询这个表的当前序号,再把当前序号+1更新回序号表。(这个功能我做了一个存储过程)
现在是怎么在视图中,调用这个 存储过程 ?(视图中不允许使用存储过程,函数中不让更新数据库)
所以现在迷惑了,请高手指点下! 展开
数据库之前是POSTGRE,
现在按客户需求,程序既要支持POSTGRE也要支持SQLSERVER数据库。
我现在想在不变动程序代码的情况下,只通过修改数据库使程序能在两个数据库下运行!
现在主要问题是POSTGRE支持sequence,在视图中这样用SELECT nextval('basis_id'::regclass) AS basis_seq_id;
就可以自动取到一个自加的序号。
我现在要在SQLSERVER的视图中,也要实现相同功能,SQLSERVER中没有sequence,
我创建了一个保管序号的表(区分,当前序号),当要取得一个新序号时,先查询这个表的当前序号,再把当前序号+1更新回序号表。(这个功能我做了一个存储过程)
现在是怎么在视图中,调用这个 存储过程 ?(视图中不允许使用存储过程,函数中不让更新数据库)
所以现在迷惑了,请高手指点下! 展开
展开全部
老弟我要挖苦你一下:
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 使用子查询也可轻松实现自增编号啊。
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数据库里,其实这个就是标识列,根本不用写程序的。加一列,类型改成标识列就可以。
数据库自动帮你添加了。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
那你为什么不直接写触发器呢,比如你插入一条记录时,你先不管插入的序列号
通过触发器来更新序列号
通过触发器来更新序列号
追问
先谢谢你的回答!
这个序号需要取出来,其它的关联表也是需要使用的。
现在的postgre数据库的视图就是做这个用的。
追答
如果使用视图确实无法实现
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询