實現動態化,爲表添加存儲時間字段,Insus.NET寫一個存儲過程,以下html
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: Insus.NET -- Blog: https://insus.cnblogs.com -- Create date: 2019-05-29 -- Update date: 2019-05-29 -- Description: 動態爲表添加存儲時間字段 -- ============================================= CREATE PROCEDURE [dbo].[usp_DyanmicallyAddStorageDatetimeField] ( @TABLE_CATALOG SYSNAME, @TABLE_SCHEMA SYSNAME, @TABLE_NAME SYSNAME, @COLUMNs NVARCHAR(MAX) -- '[column1],[column2],[column3]...' ) AS BEGIN DECLARE @source TABLE ([ID] INT IDENTITY(1,1), [value] NVARCHAR(MAX)) INSERT INTO @source ([value]) SELECT [value] FROM [dbo].[tvf_ConvertStringToTable](@COLUMNs,',') DECLARE @r INT = 1,@rs INT = 0 SELECT @rs = MAX([ID]) FROM @source WHILE @r <= @rs BEGIN DECLARE @COLUMN_NAME SYSNAME SELECT @COLUMN_NAME = CONVERT(VARCHAR(30), [value], 23) FROM @source WHERE [ID] = @r EXECUTE('IF [dbo].[usp_IsExistsColumn]('''+ @TABLE_CATALOG +''','''+ @TABLE_SCHEMA +''','''+ @TABLE_NAME +''','''+ @COLUMN_NAME +''') = 0 ALTER TABLE '+ @TABLE_NAME +' ADD '+ @COLUMN_NAME +' DATETIME') SET @r= @r + 1 END END
上面存儲過程代碼#54行中有一個定義函數:[dbo].[tvf_ConvertStringToTable]()ide
是分割字符串轉爲表。函數詳細代碼參考這篇《展開中斷或忽略的序號》http://www.javashuo.com/article/p-uwziohfb-cz.html函數
還有一個自定義函數:[dbo].[usp_IsExistsColumn]()這是判斷表的列是否存在。post
參考:《判斷列名是否存在》http://www.javashuo.com/article/p-yhxdgekl-bh.htmlurl
接下來,Insus.NET演示這個存儲過程[dbo].[usp_DyanmicallyAddStorageDatetimeField]:spa
IF OBJECT_ID('tempdb..#TempRpt') IS NOT NULL DROP TABLE #TempRpt CREATE TABLE #TempRpt ( [caseno] bigint, [username] nvarchar(20) ) EXECUTE [dbo].[usp_DyanmicallyAddStorageDatetimeField] 'tempdb','dbo','#TempRpt','[column1],[column2],[column3]' SELECT * FROM #TempRpt