zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

动态给表添加删除字段并同时修改它的插入更新存储过程

存储 删除 修改 更新 过程 添加 动态 字段
2023-06-13 09:14:31 时间
有一个表,用户需要在后台操作它,希望能对它动态进行添加删除字段。这个功能也许没有问题,但是它原有插入与更新的两个存储过程,也需要一起修改。因此Insus.NET实现了它,因此此文会让你了解到怎样动态为一个表添加删除字段以及动态修改它的存储过程

首先需要建一个表[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