首页 > 数据库 >sqlserver修改字段

sqlserver修改字段

时间:2024-08-08 09:38:46浏览次数:16  
标签:BEGIN END sqlserver TableName 修改 CreateSQL id SELECT

SET QUOTED_IDENTIFIER ON;
SET ANSI_NULLS ON;
GO

CREATE PROCEDURE p_AlterColumn
    @TableName VARCHAR(50),
    @ColumnName VARCHAR(50),
    @ColumnType VARCHAR(50), --ModifyFlag='1000' ColumnType = 'NULL' 表示删除
    @ColumnIsNull VARCHAR(10),
    @ModifyFlag VARCHAR(10), --数据类型,精度,为空,缺省值分别占1位。改了缺省值和精度该值为:'0101'
    @DefaultValue VARCHAR(255) = NULL
AS
SET NOCOUNT ON;
DECLARE @DefaultName VARCHAR(255);
DECLARE @DefaultValueSQL VARCHAR(2000);
DECLARE @IndexName sysname;
DECLARE @FieldName sysname;
DECLARE @PrevIndexName sysname;
DECLARE @IsPrimaryKey INT;
DECLARE @ColumnID SMALLINT;
DECLARE @Clustered VARCHAR(15);
DECLARE @DropSQL VARCHAR(8000);
DECLARE @CreateSQL VARCHAR(8000);
IF @ColumnType = 'BLOB'
BEGIN
    SET @ColumnType = 'IMAGE';
END;
ELSE IF @ColumnType = 'NCLOB'
BEGIN
    SET @ColumnType = 'NTEXT';
END;
ELSE IF @ColumnType = 'XMLTYPE'
BEGIN
    SET @ColumnType = 'XML';
END;
SET @DefaultValueSQL = '';
IF SUBSTRING(@ModifyFlag, 4, 1) = '1' --修改缺省值
BEGIN
    SELECT @DefaultName = ISNULL(OBJECT_NAME(O.constid), '')
    FROM sysconstraints O
        INNER JOIN syscolumns C
            ON O.id = C.id
               AND O.colid = C.colid
    WHERE O.id = OBJECT_ID(@TableName)
          AND C.name = @ColumnName;
    IF LEN(@DefaultName) > 0
    BEGIN
        EXECUTE ('ALTER TABLE ' + @TableName + ' DROP CONSTRAINT ' + @DefaultName);
    END;
    ELSE
    BEGIN --无记录是为null,LEN(NULL)>0为false
        SELECT @DefaultName = 'DF_' + @TableName + '_' + @ColumnName;
    END;
    IF @DefaultValue IS NOT NULL
       AND @DefaultValue <> 'NULL' --isnull表示删除
    BEGIN
        IF LEFT(@DefaultValue, 3) = '{ts'
        BEGIN
            SET @DefaultValue = REPLACE(REPLACE(@DefaultValue, '{ts', ''), '}', '');
        END;
        SET @DefaultValueSQL
            = 'ALTER TABLE ' + @TableName + ' ADD  CONSTRAINT ' + @DefaultName + ' DEFAULT (' + @DefaultValue
              + ') FOR ' + @ColumnName;
    END;
END; --SUBSTRING(@ModifyFlag,4,1) = '1'	--修改缺省值
IF (
       SUBSTRING(@ModifyFlag, 3, 1) = '1'
       AND UPPER(@ColumnIsNull) = 'NOT NULL'
   )
   OR (SUBSTRING(@ModifyFlag, 1, 1) = '1')
   OR (SUBSTRING(@ModifyFlag, 2, 1) = '1')
BEGIN
    SELECT @DropSQL = '',
           @PrevIndexName = '',
           @CreateSQL = '',
           @IsPrimaryKey = 0;
    SELECT @ColumnID = colid
    FROM syscolumns
    WHERE name = @ColumnName
          AND id = OBJECT_ID(@TableName);
    DECLARE curIndexes CURSOR FOR
    SELECT i.name AS IndexName,
           c.name AS FieldName,
           CASE
               WHEN o.id IS NULL THEN
                   0
               ELSE
                   OBJECTPROPERTY(o.id, 'IsPrimaryKey')
           END AS IsPrimaryKey,
           CASE i.indid
               WHEN 1 THEN
                   ' CLUSTERED '
               ELSE
                   ' NONCLUSTERED '
           END AS IsClustered
    FROM sysindexes i
        INNER JOIN sysindexkeys k
            ON i.id = k.id
               AND i.indid = k.indid
        INNER JOIN syscolumns c
            ON i.id = c.id
               AND c.colid = k.colid
        LEFT JOIN sysobjects o
            ON o.id = OBJECT_ID(i.name)
    WHERE i.id = OBJECT_ID(@TableName)
          AND INDEXPROPERTY(i.id, i.name, 'IsAutoStatistics') <> 1
          AND i.indid IN
              (
                  SELECT indid FROM sysindexkeys WHERE id = k.id AND colid = @ColumnID
              )
    ORDER BY i.indid;
    OPEN curIndexes;
    FETCH NEXT FROM curIndexes
    INTO @IndexName,
         @FieldName,
         @IsPrimaryKey,
         @Clustered;
    WHILE (@@FETCH_STATUS = 0)
    BEGIN
        IF @PrevIndexName <> @IndexName
        BEGIN
            IF @IsPrimaryKey = 0
            BEGIN
                SELECT @DropSQL = @DropSQL + 'DROP INDEX ' + @TableName + '.' + @IndexName + CHAR(10);
                IF @CreateSQL = ''
                    SELECT @CreateSQL
                        = 'CREATE' + @Clustered + 'INDEX ' + @IndexName + ' ON ' + @TableName + ' (' + @FieldName;
                ELSE
                    SELECT @CreateSQL
                        = @CreateSQL + ')' + CHAR(10) + 'CREATE' + @Clustered + 'INDEX ' + @IndexName + ' ON '
                          + @TableName + ' (' + @FieldName;
            END;
            ELSE
            BEGIN
                SELECT @DropSQL = @DropSQL + 'ALTER TABLE ' + @TableName + ' DROP CONSTRAINT ' + @IndexName + CHAR(10);
                IF @CreateSQL = ''
                    SELECT @CreateSQL
                        = 'ALTER TABLE ' + @TableName + ' ADD CONSTRAINT ' + @IndexName + ' PRIMARY KEY' + @Clustered
                          + '(' + @FieldName;
                ELSE
                    SELECT @CreateSQL
                        = @CreateSQL + ')' + CHAR(10) + 'ALTER TABLE ' + @TableName + ' ADD CONSTRAINT ' + @IndexName
                          + ' PRIMARY KEY' + @Clustered + '(' + @FieldName;
            END;
            SELECT @PrevIndexName = @IndexName;
        END;
        ELSE
        BEGIN
            SELECT @CreateSQL = @CreateSQL + ',' + @FieldName;
        END;
        FETCH NEXT FROM curIndexes
        INTO @IndexName,
             @FieldName,
             @IsPrimaryKey,
             @Clustered;
    END;
    CLOSE curIndexes;
    DEALLOCATE curIndexes;
    IF @CreateSQL <> ''
        SELECT @CreateSQL = @CreateSQL + ')';
    EXECUTE (@DropSQL);
END;
IF @ColumnType = ''
   OR @ColumnType = 'NULL'
BEGIN
    EXECUTE ('ALTER TABLE ' + @TableName + ' DROP COLUMN ' + @ColumnName + ' ');
END;
ELSE
BEGIN
    IF (SUBSTRING(@ModifyFlag, 1, 1) = '1') --修改类型
    BEGIN
        EXECUTE ('ALTER TABLE ' + @TableName + ' ALTER COLUMN ' + @ColumnName + ' ' + @ColumnType + ' ' + @ColumnIsNull + ' ');
        IF (SUBSTRING(@ModifyFlag, 3, 1) = '1' AND @ColumnIsNull = 'NOT NULL') --“是否为空”有null修改为notnull,必须要有缺省值
        BEGIN
            EXECUTE ('UPDATE ' + @TableName + ' SET ' + @ColumnName + ' = ' + @DefaultValue + ' WHERE ' + @ColumnName + ' IS NULL ');
        END;
    END;
    ELSE -- 如果修改了精度、为空
    BEGIN
        IF (SUBSTRING(@ModifyFlag, 3, 1) = '1' AND @ColumnIsNull = 'NOT NULL') --“是否为空”有null修改为notnull,必须要有缺省值
        BEGIN
            EXECUTE ('UPDATE ' + @TableName + ' SET ' + @ColumnName + ' = ' + @DefaultValue + ' WHERE ' + @ColumnName + ' IS NULL ');
        END;
        IF (
               SUBSTRING(@ModifyFlag, 2, 1) = '1'
               OR SUBSTRING(@ModifyFlag, 3, 1) = '1'
           ) --修改了精度和为空才执行,只修改缺省值不执行
        BEGIN
            EXECUTE ('ALTER TABLE ' + @TableName + ' ALTER COLUMN ' + @ColumnName + ' ' + @ColumnType + ' ' + @ColumnIsNull + ' ');
        END;
    END;
    IF @DefaultValueSQL <> ''
    BEGIN
        EXECUTE (@DefaultValueSQL);
    END;
    IF @CreateSQL <> ''
    BEGIN
        EXECUTE (@CreateSQL);
    END;
END;


GO

  

标签:BEGIN,END,sqlserver,TableName,修改,CreateSQL,id,SELECT
From: https://www.cnblogs.com/coolyylu/p/18348324

相关文章

  • 淘宝库存更新修改接口
    先来看看这个接口的请求参数 num_iid:是指需要修改的淘宝商品的数字id,一般是通过接口拉取店铺的商品列表取得的,这个参数是必填的sku_id:是指淘宝商品的销售属性唯一id,如果是更新某个销售属性的库存数量就得填写,比如你一件衣服,它有红色和黄色的两个颜色的销售属性,那么你可以单......
  • 删除双系统误修改Win11 EFI分区的解决方案
    重要提示本文写于2024年8月,请注意文章内容的时效性,以免给您宝贵的电脑造成损伤。或许每个程序员都想给自己的电脑安装双系统,我也是其中之一。但是,安装Ubuntu后的两个月内,仅仅开机两次,这使我认识到它终究只是个摆设,是时候和它说再见了。删除Ubuntu其实并不麻烦,搜索“磁盘管理......
  • 登录优化------修改密码后,旧的令牌应该失效
    我们以前使用的令牌,修改密码后,旧的令牌仍然可以使用,相当于仍然可以使用旧密码“登录”这很危险。这时候需要使用redis让旧令牌主动失效。实现思路:借助redis,当用户登录成功之后,依然需要生成令牌,但这个令牌它在响应给浏览器的同时也需要往redis中存储一份。当浏览器携带着令......
  • SqlServer 主从复制错误分析--20598
    十年河东,十年河西,莫欺少年穷学无止境,精益求精1、在分发服务器执行如下脚本select*fromMSsubscriber_infoselect*fromMSpublications 2、选择分发数据库-distribution,执行如下脚本 sp_helpsubscriptionerrors'IZQY9C2TQSKGS9ZTEST','DBTEST','DbPiblish'......
  • 泛微OA移动端在公网IP变更和无法打开Install.do界面下修改插件库地址(122,128报错)
    事情起因因为公司搬迁,公网IP变更,服务器搬迁时未提前调整好泛微oa服务器的IP,但是旧地址仍留有主路由可以使用。发现问题移动端无法正常连接,/install.do的界面也无法打开,无法进入修改插件库服务器IP的页面联系了技术,技术表示/install.do无法打开的话也无能为力(因为公司维护费断......
  • C# wnform 三层架构 增删改查 修改数据(修改篇)
    ss一.留言本专栏三层架构已经更新了添加登录显示,还差修改以及删除,本篇更新修改,主要操作为点击修改某一条数据,然后跳转页面进行修改。二.展示我们先看DAL代码///<summary>///修改///</summary>///<paramname="id"></param>//......
  • HarmonyOS DevEco Studio彻底修改工程名称
    关闭项目将项目文件夹替换为新的名称后重新打开项目将AppScope/app.json5中的bundleName改为新的包名{"app":{"bundleName":"com.example.newname",//改为新的包名"vendor":"example","versionCode":1000000,"......
  • 修改.gitignore里面曾经追踪过的文件变成不追踪
    .gitignore 只能忽略那些原来没有被追踪(tracked)的文件,如果某些文件已经被纳入了版本管理中,则修改 .gitignore 是无效的解决方法就是,先把本地缓存删除(改成未track状态),然后再提交:gitrm-r--cached.gitadd.gitcommit-m'update.gitignore'gitpush 具体步骤如下......
  • Header Editor管理浏览器请求,包括修改请求头和响应头、重定向请求、取消请求
    HeaderEditor管理浏览器请求,包括修改请求头和响应头、重定向请求、取消请求 https://github.com/FirefoxBar/HeaderEditor 浏览器安装 FirefoxMozillaAdd-on 或我们的自分发版本 ChromeChromeWebStore Edge(Chromium)EdgeAddons  ......
  • Mac 修改brew镜像源为阿里镜像源
    1.备份当前的Homebrew源:在开始修改之前,建议备份当前的Homebrew源地址。你可以使用以下命令备份:cp-R/usr/local/Homebrew/usr/local/Homebrew.backup这会在/usr/local目录下创建一个Homebrew.backup文件夹,其中包含当前的Homebrew源代码。 2.修改Homebrew的......