找回密码
 立即注册

QQ登录

只需一步,快速开始

successit 悬赏达人认证
银牌会员   /  发表于:2021-9-16 08:37  /   查看:7088  /  回复:25
本帖最后由 successit 于 2021-9-16 08:51 编辑

前提条件:创建两张视图,分别为:v_GZL_DB_A  及 v_GZL_YB_A  ,如果不创建,可以在存储过程里添加检测视图是否存在,如果存在,则更新,如果不存在则创建,我这里是已经建好的,所以略过
这个方法就在于,当系统中开启一个新的工作流后,由存储过程自动把新增的工作流待办及已办历史信息表更新到原有的视图语句中去,同时还解决一个就是开启新的工作流后,工作流历史记录表,并不会创建,当有人提交一条工作流后才会创建,如果存储过程设置了触发机制,那当有人提交了工作流后,数据库就会自动去更新对应的视图,免去人为维护
存储过程代码如下:

ALTER PROC [dbo].[p_GZL_DBView_Alt]
AS
BEGIN
--获取数据库中包含FGC_WHT字符的数据表名,并与当前已办视图比对,如果没有新增的工作流视图表返回,如果有,则去更新已办和待办视图
DECLARE @DB_Count AS int
set @DB_Count =
(select count(dbname)
from
(SELECT name as dbname FROM SYS.SYSOBJECTS WHERE type='U' AND [name] LIKE '%_FGC_WHT%'
except
SELECT DISTINCT dbname FROM v_GZL_YB_A) t)

IF @DB_Count = 0

RETURN

ELSE

DECLARE @已办 VARCHAR(MAX)
DECLARE @待办 VARCHAR(MAX)
--DECLARE @FGC_AssignTo VARCHAR(MAX)
--SET @FGC_AssignTo = 'substring(REPLACE(REPLACE(FGC_AssignTo, CHAR(13), '''') , CHAR(10),'',''),2,LEN(REPLACE(REPLACE(FGC_AssignTo, CHAR(13), '''') , CHAR(10),'','')) - 2) AS AssignTo '    ---把默认的待办人去除空格及回车符
SET @已办=''
SET @待办=''

----获取所有工作流历史视图表及所需字段,并用UNION ALL 组合起来,得到历史视图语句
SELECT @已办=@已办 +CHAR(13)+CHAR(10)+'UNION ALL' + CHAR(13)+CHAR(10) + 'SELECT' + ' ''' + ''+[name]+'' + ''' '+ 'AS DBname,ID AS 历史表ID,RecordId AS 原表ID,Who AS 办理人,[When] AS 办理时间,FGC_State AS 办理节点,'+''''+[name]+'''' + '+' + '''_'''+'+'+'CAST(ID AS NVARCHAR(50)) AS 唯一码
FROM ['+[name]+']'
FROM SYS.SYSOBJECTS
WHERE type='U' AND [name] LIKE '%_FGC_WHT%'

----根据历史视图表,去掉后缀_FGC_WHT字符,得到原表,并用UNION ALL组合起来,得到原表待办视图语句
SELECT @待办=@待办 +CHAR(13)+CHAR(10)+'UNION ALL' + CHAR(13)+CHAR(10) + 'SELECT' + ' ''' + ''+REPLACE([name],'_FGC_WHT','')+'' + ''' '+ 'AS DBname,ID AS 原表ID,FGC_State,FGC_AssignTo,'+''''+REPLACE([name],'_FGC_WHT','')+'''' + '+' + '''_'''+'+'+'CAST(ID AS NVARCHAR(50)) AS 唯一码
FROM ['+REPLACE([name],'_FGC_WHT','')+']' + ' ' +  'WHERE ISNULL(FGC_AssignTo,'''') <> '''''
FROM SYS.SYSOBJECTS
WHERE type='U' AND [name] LIKE '%_FGC_WHT%'

-----去除语句的多于拼接字符-----
SET @已办=STUFF(@已办,1,11,'')
SET @待办=STUFF(@待办,1,11,'')


-----把已办视图用胡老板的WITH AS拼接
SET @已办 =
'WITH CTE AS ('
+@已办+CHAR(13)+CHAR(10)+
')
SELECT
  (SELECT COUNT(*) FROM CTE B WHERE A.唯一码 >= B.唯一码) AS ID,
  DBname AS DBname,
  历史表ID ,
  原表ID,
  办理人,
  办理时间,
  办理节点
FROM CTE AS A'

--PRINT @已办  ----查看拼接后的SQL语句
--EXEC (@已办) ----测试执行拼接后的SQL语句

-----创建并执行已办视图更新
DECLARE @已办视图 varchar(MAX)
SET @已办视图 = ('ALTER VIEW v_GZL_YB_A AS' + CHAR(13)+CHAR(10) +  @已办 )
EXEC (@已办视图)

-----把待办视图用胡老板的WITH AS拼接----
SET @待办 =
'WITH CTE AS ('
+@待办+CHAR(13)+CHAR(10)+
')
SELECT
  (SELECT COUNT(*) FROM CTE B WHERE A.唯一码 >= B.唯一码) AS ID,
  DBname AS DBname,
  FGC_AssignTo AS AssignTo,
  FGC_State AS State,
  原表ID
FROM CTE AS A'

----创建并执行待办视图更新----
DECLARE @待办视图 varchar(MAX)
SET @待办视图 = ('ALTER VIEW v_GZL_DB_A AS' + CHAR(13)+CHAR(10) + @待办 )
EXEC (@待办视图)
END


GO



评分

参与人数 2金币 +5 满意度 +5 收起 理由
Joe.xu + 5 很给力!
aatest + 5

查看全部评分

25 个回复

倒序浏览
successit悬赏达人认证
银牌会员   /  发表于:2021-9-16 08:45:12
沙发
最后得到的待办视图:
ALTER VIEW [dbo].[v_GZL_DB_A] AS
WITH CTE AS (
SELECT 't_XS_XSCH_P' AS DBname,ID AS 原表ID,FGC_State,FGC_AssignTo,'t_XS_XSCH_P'+'_'+CAST(ID AS NVARCHAR(50)) AS 唯一码
FROM [t_XS_XSCH_P] WHERE ISNULL(FGC_AssignTo,'') <> ''
UNION ALL
SELECT 't_XS_XSDD_P' AS DBname,ID AS 原表ID,FGC_State,FGC_AssignTo,'t_XS_XSDD_P'+'_'+CAST(ID AS NVARCHAR(50)) AS 唯一码
FROM [t_XS_XSDD_P] WHERE ISNULL(FGC_AssignTo,'') <> ''
)
SELECT
  (SELECT COUNT(*) FROM CTE B WHERE A.唯一码 >= B.唯一码) AS ID,
  DBname AS DBname,
  FGC_AssignTo AS AssignTo,
  FGC_State AS State,
  原表ID
FROM CTE AS A
GO
回复 使用道具 举报
successit悬赏达人认证
银牌会员   /  发表于:2021-9-16 08:46:13
板凳
已办视图语句:
ALTER VIEW [dbo].[v_GZL_YB_A] AS
WITH CTE AS (
SELECT 't_XS_XSCH_P_FGC_WHT' AS DBname,ID AS 历史表ID,RecordId AS 原表ID,Who AS 办理人,[When] AS 办理时间,FGC_State AS 办理节点,'t_XS_XSCH_P_FGC_WHT'+'_'+CAST(ID AS NVARCHAR(50)) AS 唯一码
FROM [t_XS_XSCH_P_FGC_WHT]
UNION ALL
SELECT 't_XS_XSDD_P_FGC_WHT' AS DBname,ID AS 历史表ID,RecordId AS 原表ID,Who AS 办理人,[When] AS 办理时间,FGC_State AS 办理节点,'t_XS_XSDD_P_FGC_WHT'+'_'+CAST(ID AS NVARCHAR(50)) AS 唯一码
FROM [t_XS_XSDD_P_FGC_WHT]
)
SELECT
  (SELECT COUNT(*) FROM CTE B WHERE A.唯一码 >= B.唯一码) AS ID,
  DBname AS DBname,
  历史表ID ,
  原表ID,
  办理人,
  办理时间,
  办理节点
FROM CTE AS A
GO
回复 使用道具 举报
aatest
高级会员   /  发表于:2021-9-16 09:23:51
地板
老铁 这个支持外联数据库吗
回复 使用道具 举报
aatest
高级会员   /  发表于:2021-9-16 09:26:06
5#
可以在存储过程里添加检测视图是否存在,如果存在,则更新,如果不存在则创建,  老铁能不能 把这部分代码也加进去,小白不会玩呢
回复 使用道具 举报
aatest
高级会员   /  发表于:2021-9-16 09:28:50
6#
外联sqlserver 貌似不行
回复 使用道具 举报
successit悬赏达人认证
银牌会员   /  发表于:2021-9-16 11:10:03
7#
aatest 发表于 2021-9-16 09:28
外联sqlserver 貌似不行

行的,我就是用的外联SQL,另外关于自动创建视图的问题,我建议先手动去创建,因为这个视图你开发时是要绑定到页面上的,所以就不存在如果没有这个情况的
回复 使用道具 举报
aatest
高级会员   /  发表于:2021-9-16 11:40:19
8#
successit 发表于 2021-9-16 11:10
行的,我就是用的外联SQL,另外关于自动创建视图的问题,我建议先手动去创建,因为这个视图你开发时是要 ...

主要是不知道这2个视图 包含哪些字段 引用了哪些表
回复 使用道具 举报
aatest
高级会员   /  发表于:2021-9-16 11:40:39
9#
successit 发表于 2021-9-16 11:10
行的,我就是用的外联SQL,另外关于自动创建视图的问题,我建议先手动去创建,因为这个视图你开发时是要 ...

直接复制你的存储过程 貌似报错了
回复 使用道具 举报
aatest
高级会员   /  发表于:2021-9-16 11:44:34
10#
successit 发表于 2021-9-16 11:10
行的,我就是用的外联SQL,另外关于自动创建视图的问题,我建议先手动去创建,因为这个视图你开发时是要 ...

image.png174385680.png
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部