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



    /* 
    原创: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

  • 相关阅读:
    elk 搭建
    Web 开发规范 — WSGI
    Web 开发规范 — WSGI
    fastjson生成和解析json数据,序列化和反序列化数据
    第四章 字典
    Struts2 无后缀action请求
    字典和列表访问方式:
    第3章 使用字符串
    Struts2中的ModelDriven机制及其运用
    Struts2 的Action中取得请求参数值的几种方法
  • 原文地址:https://www.cnblogs.com/bobofsj11/p/1291098.html
Copyright © 2020-2023  润新知