动态给表添加删除字段并同时修改它的插入更新存储过程
存储 删除 修改 更新 过程 添加 动态 字段
2023-06-13 09:14:31 时间
有一个表,用户需要在后台操作它,希望能对它动态进行添加删除字段。这个功能也许没有问题,但是它原有插入与更新的两个存储过程,也需要一起修改。因此Insus.NET实现了它,因此此文会让你了解到怎样动态为一个表添加删除字段以及动态修改它的存储过程
首先需要建一个表[A],这个表只有两个字段,一个是[ID]自动增长,另一个是表[B]的字段名,存储的每一笔记录,即是用户需要操作的表[B]的字段。这个表[A]需要建添加,更新,以及删除的存储过程,方便用户在后台方便操作,还有重点部分,需要写触发器。如有记录对表[A]进行添加,更新或是删除时,它会触发去作表[B]相应操作,还要去修改表[B]的存储过程。
动态修改表[B]的存储过程:
复制代码代码如下:
首先需要建一个表[A],这个表只有两个字段,一个是[ID]自动增长,另一个是表[B]的字段名,存储的每一笔记录,即是用户需要操作的表[B]的字段。这个表[A]需要建添加,更新,以及删除的存储过程,方便用户在后台方便操作,还有重点部分,需要写触发器。如有记录对表[A]进行添加,更新或是删除时,它会触发去作表[B]相应操作,还要去修改表[B]的存储过程。
动态修改表[B]的存储过程:
CREATEPROCEDURE[dbo].[usp_B_DymanicallyAlterStoreProcedure]
AS
DECLARE@VariableListNVARCHAR(MAX)=""
DECLARE@FieldListNVARCHAR(MAX)=""
DECLARE@ValueListNVARCHAR(MAX)=""
DECLARE@FieldValueListNVARCHAR(MAX)=""
DECLARE@IINT=1,@RINT=0
SET@R=(SELECTMAX([Id])FROM[dbo].[A])
WHILE(@I<=@R)
BEGIN
DECLARE@fNameNVARCHAR(100)
IFEXISTS(SELECT[Id]FROM[dbo].[A]WHERE[Id]=@I)
BEGIN
SELECT@fName=[FieldName]FROM[dbo].[A]WHERE[Id]=@I
SET@VariableList=@VariableList+",@"+@fName+"DECIMAL(18,4)"--动态的字段数据类型都一样
SET@FieldList=@FieldList+",["+@fName+"]"
SET@ValueList=@ValueList+",@"+@fName
SET@FieldValueList=@FieldValueList+",["+@fName+"]=@"+@fName
END
SET@I=@I+1
END
DECLARE@sql_INVARCHAR(MAX),@sql_UNVARCHAR(MAX)
SET@sql_I="
ALTERPROCEDURE[dbo].[usp_B_Insert]
(
@ItemCodeNVARCHAR(50)
"+@VariableList+"
)
AS
INSERTINTO[dbo].[B]([ItemCode]"+@FieldList+")VALUES(@ItemCode"+@ValueList+")
"
EXECUTEsp_EXECUTESQL@sql_I;
SET@sql_U="
ALTERPROCEDURE[dbo].[usp_B_Update]
(
@IdINT,
@ItemCodeNVARCHAR(50)
"+@VariableList+"
)
AS
UPDATE[dbo].[B]SET[ItemCode]=@ItemCode"+@FieldValueList+"WHERE[Id]=@Id
"
EXECUTEsp_EXECUTESQL@sql_U;
表[A]的插入触发器:
CREATETRIGGER[dbo].[tri_A_Insert]ON[dbo].[A]
FORINSERT
AS
BEGIN
SETNOCOUNTON
DECLARE@FieldNameNVARCHAR(50)
SELECT@FieldName=[FieldName]FROMINSERTED
EXECUTE("IFNOTEXISTS(SELECT*FROMSYSCOLUMNSWHERE[id]=OBJECT_ID(""B"")AND[name]="""+@FieldName+""")
ALTERTABLE[B]ADD["+@FieldName+"]DECIMAL(18,4)NULL")
EXECUTE[dbo].[usp_B_DymanicallyAlterStoreProcedure];
END
表[A]删除触发器:
CREATETRIGGER[dbo].[tri_A_Delete]ON[dbo].[A]
FORDELETE
AS
BEGIN
SETNOCOUNTON
DECLARE@FieldNameNVARCHAR(50)
SELECT@FieldName=[FieldName]FROMDELETED
EXECUTE("IFEXISTS(SELECT*FROMSYSCOLUMNSWHERE[id]=OBJECT_ID(""B"")AND[name]="""+@FieldName+""")
ALTERTABLE[B]DROPCOLUMN["+@FieldName+"]")
EXECUTE[dbo].[usp_B_DymanicallyAlterStoreProcedure];
END
相关文章
- jQuery 如何存储,获取和删除 Cookies
- 开启Linux下的存储空间共享之旅(linux存储共享)
- Linux Keyctl:实现安全的密码存储(linuxkeyctl)
- 快速删除 MSSQL 存储过程:三步走(mssql删除存储过程)
- 删除Oracle存储过程:简单步骤实现(删除oracle存储过程)
- Linux下删除基于软RAID的数据存储(linux删除软raid)
- 优化数据存储:深度解析Oracle表分区的作用(oracle表分区的作用)
- 如何删除MySQL中的存储过程(删除mysql存储过程)
- Oracle 数据表重构:提高数据存储效率和性能优化(oracle表重构)
- 数据使用Oracle存储过程快速删除数据(oracle存储过程删除)
- 如何正确删除MySQL存储过程?(删除存储过程mysql)
- Oracle存储过程调用:改变自动化工作流程(调用oracle存储过程)
- 注册Redis踏上更快速可靠的数据存储之旅(注册redis)
- 怎么做如何有效利用存储在Redis中的数据(数据存储到Redis后)
- 优化加速Redis的向量存储实现(向量存储 redis)
- Redis实现快速输出所有存储数据(redis 输出所有数据)
- Redis读取速度更快,存储更稳定(redis读取存储速度)
- 下一代计算机架构登场!惠普展示以存储为核心的 “the Machine” 原型机
- sql存储过程批量删除数据的语句
- c#中两种不同的存储过程调用与比较
- OracleNumber型数值存储与转换的实现详解