動態爲表添加存儲時間字段 展開中斷或忽略的序號 判斷列名是否存在

實現動態化,爲表添加存儲時間字段,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
Source Code

 

上面存儲過程代碼#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
Source Code
相關文章
相關標籤/搜索