ERWIN脚本

ERWIN脚本好像是基于文本式的脚本语言,未找到直接定义变量的方法。目前的解决方法是,有需要用到变量的代码点,再次执行生成变量值的脚本。因为是基于文本的脚本,所以脚本语法可以随意嵌套,如判断不存在某个表字段,然后做一些处理的脚本可以这样写:

%If(%!=(%ForEachColumn(Parent,","){%If(%==(%ColName,CancelJudge)){NotRealDelete}},NotRealDelete)))
{
DELETE FROM  dbo.%TableName
WHERE
%ForEachColumn(Parent," AND ")
{
%If(%ColIsPK)
{
%ColName = @%ColName}}
}

 

========== 表新增、删除、修改的脚本示例 ==========

【TableName_Delete】

 

%ForEachTable()  {
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[%TableName_Delete]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[%TableName_Delete]
go

CREATE PROCEDURE  dbo.%TableName_Delete
(
%ForEachColumn(Parent,",")
{
 %If(%ColIsPK)
{
 @%ColName %ColumnDatatype}}
)
AS


%ForEachColumn(Parent,",")
{
%If(%==(%ColName,CancelJudge))
{
UPDATE  dbo.%TableName SET
CancelJudge = 1
WHERE
%ForEachColumn(Parent," AND ")
{
%If(%ColIsPK)
{
%ColName = @%ColName}}
}}

%If(%!=(%ForEachColumn(Parent,","){%If(%==(%ColName,CancelJudge)){NotRealDelete}},NotRealDelete)))
{
DELETE FROM  dbo.%TableName
WHERE
%ForEachColumn(Parent," AND ")
{
%If(%ColIsPK)
{
%ColName = @%ColName}}
}

go

}

 

【TableName_Insert】

%ForEachTable()  {
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[%TableName_Insert]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[%TableName_Insert]
go


CREATE PROCEDURE  dbo.%TableName_Insert
(
%ForEachColumn(Parent,",")
{
%If(%!=(%Substr(%AttNullOption,1,8),IDENTITY))
{
%If(%!=(%ColName,LastChanged)){@%ColName %ColumnDatatype}}},
%ForEachColumn(Parent,",")
{
%If(%==(%Substr(%AttNullOption,1,8),IDENTITY)){@newId %ColumnDatatype output,}
}@newLastChanged timestamp output
)
AS
INSERT INTO  dbo.%TableName
(%ForEachColumn(Parent,",")
{
 %If(%And(%!=(%Substr(%AttNullOption,1,8),IDENTITY),%!=(%ColName,LastChanged)))
 {%ColName}}
)
VALUES
(%ForEachColumn(Parent,",")
{
 %If(%And(%!=(%Substr(%AttNullOption,1,8),IDENTITY),%!=(%ColName,LastChanged)))
 {@%ColName}}
)
 
  %ForEachColumn (Parent,","){
     %If(%ColIsPK)
     {
        %If(%!=(%Substr(%AttNullOption,1,8),IDENTITY)) 
        {
        Select @newLastChanged = LastChanged From  dbo.%TableName Where %ColName = @%ColName
        }
        %Else
        {
        Select @newId = %ColName, @newLastChanged = LastChanged From  dbo.%TableName Where %ColName = SCOPE_IDENTITY()}
     }
  }

go
}

 

【TableName_Update】

%ForEachTable()  {

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[%TableName_Update]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[%TableName_Update]
go

CREATE PROCEDURE  dbo.%TableName_Update
(
%ForEachColumn(Parent,","))
{
@%ColName %ColumnDatatype},
@newLastChanged timestamp output
)
AS
UPDATE  dbo.%TableName SET
%ForEachColumn(Parent,",")
{
%If(%And(%Not(%ColIsPK),%!=(%ColName,LastChanged)))
{
%ColName = @%ColName}}
WHERE
%ForEachColumn(Parent," AND ")
{
%If(%ColIsPK)
{
%ColName = @%ColName}} AND LastChanged=@lastChanged

IF @@ROWCOUNT = 0
    RAISERROR('Row has been edited by another user', 16, 1)             
 
SELECT @newLastChanged = LastChanged
FROM %TableName  WHERE %ForEachColumn(Parent,",")
{
%If(%ColIsPK)
{
%ColName = @%ColName}}
RETURN

go
}

 

============= 加入时间戳的旧Logic方式脚本 ================

【Insert】

%ForEachTable()  {
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[%TableNameInsert]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[%TableNameInsert]
go

CREATE PROCEDURE  dbo.%TableNameInsert
(
 %ForEachColumn(Parent,",")
{
 %If(%!=(%Substr(%AttNullOption,1,8),IDENTITY))
 {@%ColName %ColumnDatatype}}
)
AS
INSERT INTO  dbo.%TableName
(
 %ForEachColumn(Parent,",")
{
 %If(%!=(%Substr(%AttNullOption,1,8),IDENTITY))
 {%If(%!=(%ColName,LastChanged)){%ColName}}}
)
VALUES
(
 %ForEachColumn(Parent,",")
{
 %If(%!=(%Substr(%AttNullOption,1,8),IDENTITY))
 {%If(%!=(%ColName,LastChanged)){@%ColName}}}
)
 %ForEachColumn (Parent,","){
      %If(%ColIsPK) {
           %If(%==(%Substr(%AttNullOption,1,8),IDENTITY)){
        Select %ColName %ForEachColumn(Parent," AND ")
{
%If(%==(%ColName,LastChanged))
{,LastChanged}} From dbo.%TableName Where %ColName = @@IDENTITY}
       }}
go
}

【Update】

%ForEachTable()  {

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[%TableNameUpdate]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[%TableNameUpdate]
go

CREATE PROCEDURE  dbo.%TableNameUpdate
(
%ForEachColumn(Parent,","))
{
@%ColName %ColumnDatatype}
)
AS
UPDATE  dbo.%TableName SET
%ForEachColumn(Parent,",")
{
%If(%And(%Not(%ColIsPK),%!=(%ColName,LastChanged)))
{
%ColName = @%ColName}}
WHERE
%ForEachColumn(Parent," AND ")
{
%If(%ColIsPK)
{
%ColName = @%ColName}} %ForEachColumn(Parent," AND ")
{
%If(%==(%ColName,LastChanged))
{
AND LastChanged=@LastChanged

IF @@ROWCOUNT = 0
    RAISERROR('Row has been edited by another user', 16, 1)             
SELECT LastChanged
FROM dbo.%TableName  WHERE %ForEachColumn(Parent," AND ")
{
%If(%ColIsPK)
{
%ColName = @%ColName}}
RETURN
}}
go
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值