動(dòng)態(tài)給表添加刪除字段并同時(shí)修改它的插入更新存儲(chǔ)過(guò)程
更新時(shí)間:2011年11月15日 23:46:20 作者:
有一個(gè)表,用戶需要在后臺(tái)操作它,希望能對(duì)它動(dòng)態(tài)進(jìn)行添加刪除字段
有一個(gè)表,用戶需要在后臺(tái)操作它,希望能對(duì)它動(dòng)態(tài)進(jìn)行添加刪除字段。這個(gè)功能也許沒(méi)有問(wèn)題,但是它原有插入與更新的兩個(gè)存儲(chǔ)過(guò)程,也需要一起修改。因此Insus.NET實(shí)現(xiàn)了它,因此此文會(huì)讓你了解到怎樣動(dòng)態(tài)為一個(gè)表添加刪除字段以及動(dòng)態(tài)修改它的存儲(chǔ)過(guò)程
首先需要建一個(gè)表[A],這個(gè)表只有兩個(gè)字段,一個(gè)是[ID]自動(dòng)增長(zhǎng),另一個(gè)是表[B]的字段名,存儲(chǔ)的每一筆記錄,即是用戶需要操作的表[B]的字段。這個(gè)表[A]需要建添加,更新,以及刪除的存儲(chǔ)過(guò)程,方便用戶在后臺(tái)方便操作,還有重點(diǎn)部分,需要寫觸發(fā)器。如有記錄對(duì)表[A]進(jìn)行添加,更新或是刪除時(shí),它會(huì)觸發(fā)去作表[B]相應(yīng)操作,還要去修改表[B]的存儲(chǔ)過(guò)程。
動(dòng)態(tài)修改表[B]的存儲(chǔ)過(guò)程:
CREATE PROCEDURE [dbo].[usp_B_DymanicallyAlterStoreProcedure]
AS
DECLARE @VariableList NVARCHAR(MAX) = ''
DECLARE @FieldList NVARCHAR(MAX) = ''
DECLARE @ValueList NVARCHAR(MAX) = ''
DECLARE @FieldValueList NVARCHAR(MAX) = ''
DECLARE @I INT = 1, @R INT = 0
SET @R = (SELECT MAX([Id]) FROM [dbo].[A])
WHILE (@I <= @R)
BEGIN
DECLARE @fName NVARCHAR(100)
IF EXISTS(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)' --動(dòng)態(tài)的字段數(shù)據(jù)類型都一樣
SET @FieldList = @FieldList + ',[' + @fName + ']'
SET @ValueList = @ValueList + ',@' + @fName
SET @FieldValueList = @FieldValueList + ',[' + @fName + '] = @' + @fName
END
SET @I = @I + 1
END
DECLARE @sql_I NVARCHAR(MAX),@sql_U NVARCHAR(MAX)
SET @sql_I = '
ALTER PROCEDURE [dbo].[usp_B_Insert]
(
@ItemCode NVARCHAR(50)
'+ @VariableList +'
)
AS
INSERT INTO [dbo].[B] ([ItemCode]'+ @FieldList +') VALUES (@ItemCode'+ @ValueList +')
'
EXECUTE sp_EXECUTESQL @sql_I;
SET @sql_U = '
ALTER PROCEDURE [dbo].[usp_B_Update]
(
@Id INT,
@ItemCode NVARCHAR(50)
'+ @VariableList +'
)
AS
UPDATE [dbo].[B] SET [ItemCode] = @ItemCode'+ @FieldValueList +' WHERE [Id] = @Id
'
EXECUTE sp_EXECUTESQL @sql_U;
表[A]的插入觸發(fā)器:
CREATE TRIGGER [dbo].[tri_A_Insert] ON [dbo].[A]
FOR INSERT
AS
BEGIN
SET NOCOUNT ON
DECLARE @FieldName NVARCHAR(50)
SELECT @FieldName = [FieldName] FROM INSERTED
EXECUTE('IF NOT EXISTS(SELECT * FROM SYSCOLUMNS WHERE [id] = OBJECT_ID(''B'') AND [name] = '''+ @FieldName +''')
ALTER TABLE [B] ADD ['+ @FieldName +'] DECIMAL(18,4) NULL')
EXECUTE [dbo].[usp_B_DymanicallyAlterStoreProcedure];
END
表[A]刪除觸發(fā)器:
CREATE TRIGGER [dbo].[tri_A_Delete] ON [dbo].[A]
FOR DELETE
AS
BEGIN
SET NOCOUNT ON
DECLARE @FieldName NVARCHAR(50)
SELECT @FieldName = [FieldName] FROM DELETED
EXECUTE('IF EXISTS(SELECT * FROM SYSCOLUMNS WHERE [id] = OBJECT_ID(''B'') AND [name] = '''+ @FieldName +''')
ALTER TABLE [B] DROP COLUMN ['+ @FieldName +']')
EXECUTE [dbo].[usp_B_DymanicallyAlterStoreProcedure];
END
首先需要建一個(gè)表[A],這個(gè)表只有兩個(gè)字段,一個(gè)是[ID]自動(dòng)增長(zhǎng),另一個(gè)是表[B]的字段名,存儲(chǔ)的每一筆記錄,即是用戶需要操作的表[B]的字段。這個(gè)表[A]需要建添加,更新,以及刪除的存儲(chǔ)過(guò)程,方便用戶在后臺(tái)方便操作,還有重點(diǎn)部分,需要寫觸發(fā)器。如有記錄對(duì)表[A]進(jìn)行添加,更新或是刪除時(shí),它會(huì)觸發(fā)去作表[B]相應(yīng)操作,還要去修改表[B]的存儲(chǔ)過(guò)程。
動(dòng)態(tài)修改表[B]的存儲(chǔ)過(guò)程:
復(fù)制代碼 代碼如下:
CREATE PROCEDURE [dbo].[usp_B_DymanicallyAlterStoreProcedure]
AS
DECLARE @VariableList NVARCHAR(MAX) = ''
DECLARE @FieldList NVARCHAR(MAX) = ''
DECLARE @ValueList NVARCHAR(MAX) = ''
DECLARE @FieldValueList NVARCHAR(MAX) = ''
DECLARE @I INT = 1, @R INT = 0
SET @R = (SELECT MAX([Id]) FROM [dbo].[A])
WHILE (@I <= @R)
BEGIN
DECLARE @fName NVARCHAR(100)
IF EXISTS(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)' --動(dòng)態(tài)的字段數(shù)據(jù)類型都一樣
SET @FieldList = @FieldList + ',[' + @fName + ']'
SET @ValueList = @ValueList + ',@' + @fName
SET @FieldValueList = @FieldValueList + ',[' + @fName + '] = @' + @fName
END
SET @I = @I + 1
END
DECLARE @sql_I NVARCHAR(MAX),@sql_U NVARCHAR(MAX)
SET @sql_I = '
ALTER PROCEDURE [dbo].[usp_B_Insert]
(
@ItemCode NVARCHAR(50)
'+ @VariableList +'
)
AS
INSERT INTO [dbo].[B] ([ItemCode]'+ @FieldList +') VALUES (@ItemCode'+ @ValueList +')
'
EXECUTE sp_EXECUTESQL @sql_I;
SET @sql_U = '
ALTER PROCEDURE [dbo].[usp_B_Update]
(
@Id INT,
@ItemCode NVARCHAR(50)
'+ @VariableList +'
)
AS
UPDATE [dbo].[B] SET [ItemCode] = @ItemCode'+ @FieldValueList +' WHERE [Id] = @Id
'
EXECUTE sp_EXECUTESQL @sql_U;
表[A]的插入觸發(fā)器:
復(fù)制代碼 代碼如下:
CREATE TRIGGER [dbo].[tri_A_Insert] ON [dbo].[A]
FOR INSERT
AS
BEGIN
SET NOCOUNT ON
DECLARE @FieldName NVARCHAR(50)
SELECT @FieldName = [FieldName] FROM INSERTED
EXECUTE('IF NOT EXISTS(SELECT * FROM SYSCOLUMNS WHERE [id] = OBJECT_ID(''B'') AND [name] = '''+ @FieldName +''')
ALTER TABLE [B] ADD ['+ @FieldName +'] DECIMAL(18,4) NULL')
EXECUTE [dbo].[usp_B_DymanicallyAlterStoreProcedure];
END
表[A]刪除觸發(fā)器:
復(fù)制代碼 代碼如下:
CREATE TRIGGER [dbo].[tri_A_Delete] ON [dbo].[A]
FOR DELETE
AS
BEGIN
SET NOCOUNT ON
DECLARE @FieldName NVARCHAR(50)
SELECT @FieldName = [FieldName] FROM DELETED
EXECUTE('IF EXISTS(SELECT * FROM SYSCOLUMNS WHERE [id] = OBJECT_ID(''B'') AND [name] = '''+ @FieldName +''')
ALTER TABLE [B] DROP COLUMN ['+ @FieldName +']')
EXECUTE [dbo].[usp_B_DymanicallyAlterStoreProcedure];
END
相關(guān)文章
SQL SERVER 數(shù)據(jù)庫(kù)備份代碼實(shí)例
這篇文章主要介紹了SQL SERVER數(shù)據(jù)庫(kù)備份,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03獲取SqlServer存儲(chǔ)過(guò)程定義的三種方法
這篇文章主要介紹了獲取SqlServer存儲(chǔ)過(guò)程定義的三種方法的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07MSSQL 多字段根據(jù)范圍求最大值實(shí)現(xiàn)方法
MSSQL 多字段根據(jù)范圍求最大值實(shí)現(xiàn)語(yǔ)句,大家可以參考下2009-09-09使用SqlServer CTE遞歸查詢處理樹、圖和層次結(jié)構(gòu)
遞歸CTE是SQL SERVER 2005中重要的增強(qiáng)之一。一般我們?cè)谔幚順洌瑘D和層次結(jié)構(gòu)的問(wèn)題時(shí)需要用到遞歸查詢。本文給大家詳解使用sqlserver cte遞歸查詢出來(lái)樹、圖和層次結(jié)構(gòu),本文介紹的非常詳細(xì),感興趣的朋友一起看看吧2015-11-11SQL server 自增ID--序號(hào)自動(dòng)增加的字段操作
這篇文章主要介紹了SQL server 自增ID--序號(hào)自動(dòng)增加的字段操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10mssql 30萬(wàn)條數(shù)據(jù) 搜索文本字段的各種方式對(duì)比
30萬(wàn)條,有ID列但無(wú)主鍵,在要搜索的“分類”字段上建有非聚集索引2010-04-04sqlserver數(shù)據(jù)庫(kù)危險(xiǎn)擴(kuò)展刪除和恢復(fù)代碼
今天為了實(shí)現(xiàn)sqlserver的復(fù)制功能,因?yàn)橐郧皠h除了很多的sqlserver的一些會(huì)導(dǎo)致不安全因素的擴(kuò)展,導(dǎo)致很多功能無(wú)法用,沒(méi)有辦法需要重新的恢復(fù)擴(kuò)展。2010-07-07