动态传入“表名,字段名,字段类型,默认值”四个字符串,根据新的字段名称和类型来创表表结构


/* 
原创:fcuandy 
修改:bing110 
功能:动态传入“表名,字段名,字段类型,默认值”四个字符串,根据新的字段名称和类型来创表表结构 
不足:由于修改的表时候保留原来字段的数据,所以现在暂时还不能修改字段类型,创建的表中也不能创建索引,外键约束等功能 
日期:2008-9-9 
*/
 

CREATE  FUNCTION dbo.Split --自定义的拆分函数,用来装传入的字符串分隔成表 

@ItemList VARCHAR(4000), 
@delimiter VARCHAR(10

RETURNS @IDTable TABLE (IndexID INT IDENTITY(1,1),Item VARCHAR(50)) 

AS 
    
BEGIN 

    
WHILE CHARINDEX(@delimiter@ItemList)>0 
        
BEGIN 
            
INSERT @IDTable SELECT LEFT(@ItemList,CHARINDEX(@delimiter,@ItemList)-1
            
SET @ItemList=STUFF(@ItemList,1,CHARINDEX(@delimiter,@ItemList),''
        
END 
        
INSERT @IDTable SELECT @ItemList 
    
RETURN 

    
END 


CREATE PROC P_Alter_Table 
@tb VARCHAR(100),  --表名 
@fieldsLists VARCHAR(1000),  --字段列表 
@fieldsTypeLists VARCHAR(1000),  --字段类型列表,需要与字段列表一一对应 
@DefaultValue VARCHAR(1000)    --新增字段默认值,与字段一一对应 
AS 
BEGIN 
    
DECLARE @sql VARCHAR(8000
    
DECLARE @sql1 VARCHAR(8000),@sql2 VARCHAR(8000),@Sql0 VARCHAR(8000
    
    
IF object_id(@tb,'u'IS NULL --若表不存在 
        BEGIN 
            
SELECT @sql=ISNULL(@sql + ',',''+ '[' + a.Item + '' + b.Item +' Default '+CHAR(39)+ c.Item +CHAR(39
                
FROM dbo.Split(@fieldsLists,',') a 
            
INNER JOIN 
                dbo.Split(
@fieldsTypeLists,',') b 
                
ON a.IndexID=b.IndexID 
            
INNER JOIN dbo.Split(@DefaultValue,',') C 
                
ON a.IndexId=C.IndexId 
            
EXEC('CREATE TABLE [' + @tb + '](' + @sql + ')'
        
END 
    
ELSE  --若表存在 
        BEGIN 
            
SELECT @sql1='',@sql2='',@sql0='' 

            
SELECT  @sql1=@sql1 + CASE WHEN Field IS NULL THEN '['+name+'],' ELSE '' END,--记录待删除列列表 
                    @Sql0=@Sql0 + CASE WHEN Field IS NULL AND CDEFAULT <> 0 THEN (SELECT [NAME] FROM SYSOBJECTS WHERE ID=CDEFAULT) + ',' ELSE '' END--记录待删除的默认值 
                    @sql2=@sql2 + CASE WHEN Name IS NULL THEN '['+Field+'' + FType + ' Default '+CHAR(39)+ DValue + CHAR(39)+',' ELSE '' END --记录待新增列列表 
                FROM 
                (
SELECT [NAME],CDEFAULT FROM syscolumns WHERE id=object_id(@tb,'u')) a 
            
FULL OUTER JOIN 
                ( 
                    
SELECT b.Item Field,a.Item FType,c.Item DValue FROM 
                        dbo.Split(
@fieldsLists,',') b 
                    
INNER JOIN dbo.Split(@fieldsTypeLists,',') a 
                        
ON a.IndexID=b.IndexID 
                    
INNER JOIN dbo.Split(@DefaultValue,',') c 
                        
ON a.IndexId=c.IndexId 
                ) b 
    
                
ON name=Field 
            
SELECT @sql1=STUFF(@sql1,LEN(@sql1),1,''),@sql2=STUFF(@sql2,LEN(@sql2),1,''),@sql0=STUFF(@sql0,LEN(@sql0),1,''

            
IF LEN(@sql2)>0 
              
EXEC('ALTER TABLE [' + @tb + '] ADD ' + @sql2)  --先加原表中不存在的列 
            IF LEN(@Sql0)>0              
              
EXEC('ALTER TABLE ['+ @TB+ '] DROP CONSTRAINT '+ @Sql0--删除表中不需要字段的默认值 
            IF LEN(@sql1)>0 
              
EXEC('ALTER TABLE [' + @tb + '] DROP COLUMN ' + @sql1)  --再删除新传入结构中不需要的列 

        
END 
END 

Eg: 

EXEC P_ALTER_TABLE 'A','A1,A2','INT,VARCHAR(10)','0,T' 

SELECT * FROM A

原文地址:https://www.cnblogs.com/bobofsj11/p/1291098.html