zoukankan      html  css  js  c++  java
  • 记一SQL部署问题

    在部署环境时,不同的环境可能会有一些不同步,而个人遇到的问题就是在开发环境中表中均有字段 BestCaseId 和 RiskId 字段,生产环境中目前只有 BestCaseId 字段,新搭建的测试环境中暂时都不存在这两个字段(某些原因需要另一单独测试环境)。

    保证在生产环境中的 BestCaseId 字段数据暂时不删除的情况下将其数据迁移到 RiskId 字段,

    场景如下:

    起始时有如下表及数据:

    创建表脚本及插入数据脚本如下:(仅为演示使用,直接创建在master db下)

    CREATE TABLE [dbo].[Following](
        [Id]            [nvarchar](50)   NOT NULL,
        [Name]          [nvarchar](40)   NULL,
        [Description]   [nvarchar](400) NULL,
        [BestCaseId]    [int]            NULL
     CONSTRAINT [PK_Following] PRIMARY KEY CLUSTERED 
    (
        [Id] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO
    INSERT INTO [dbo].[Following] VALUES ('1','data1',null,1)
    INSERT INTO [dbo].[Following] VALUES ('2','data2',null,2)
    INSERT INTO [dbo].[Following] VALUES ('3','data3',null,3)
    INSERT INTO [dbo].[Following] VALUES ('4','data4',null,4)
    INSERT INTO [dbo].[Following] VALUES ('5','data5',null,5)
    INSERT INTO [dbo].[Following] VALUES ('6','data6',null,6)
    GO
    SQL SCRIPT

    但随着需求的变更,需要新添加一字段 RiskId, 字段值从 BestCaseId 字段获取:

    ALTER TABLE [master].[dbo].[Following]
    ADD RiskId INT

    需要将 BestCaseId 字段值迁移到 RiskId 字段,脚本如下:

    IF EXISTS(SELECT * FROM syscolumns WHERE id=object_id('Following') AND name='BestCaseId') 
        BEGIN
            PRINT 'Column BestCaseId exist'
            UPDATE [master].[dbo].[Following] SET RiskId = 
            (CASE 
                WHEN BestCaseId = 1
                THEN 1
                WHEN BestCaseId = 2
                THEN 2
                WHEN BestCaseId = 3
                THEN 3
                WHEN BestCaseId = 4
                THEN 1
                WHEN BestCaseId = 5
                THEN 2
                WHEN BestCaseId = 6
                THEN 3
            END)
        END
    ELSE
        PRINT 'Column BestCaseId is not exist'

    上述代码首先校验表中是否已存在相应字段,如果存在相应字段,打印并进行数据迁移;如果不存在,打印相应提示。

    但问题是在已经存在 BestCaseId 字段的生产环境中可正常运行,但在不存在 BestCaseId 字段的新测试环境中却报错。

    可通过删除 BestCaseId 字段进行测试:

    ALTER TABLE [master].[dbo].[Following]
    DROP COLUMN BestCaseId

     在不存在 BestCaseId 字段情况下,迁移脚本虽然可通过 Parse, 但在执行时却会有如下 Error:

    Msg 207, Level 16, State 1, Line 12
    Invalid column name 'BestCaseId'.

    错误原因一直不理解,但如果把 SQL SCRIPT 做为编译语言而非解释语言的话,就会理解错误原因,但原因却是这样吗?毕竟可以通过 Parse.

    希望能尽早知道问题原因。

    最后的解决方法:

    IF EXISTS(SELECT * FROM syscolumns WHERE id=object_id('Following') AND name='BestCaseId')
        BEGIN
            PRINT 'Column BestCaseId exist';
            DECLARE @tmpSQl NVARCHAR(2000);
            SET @tmpSQl = 'UPDATE [master].[dbo].[Following] ';
            SET @tmpSQl += 'SET RISKID = 
                (CASE 
                WHEN BestCaseId = 1 
                THEN 1 
                WHEN BestCaseId = 2 
                THEN 2 
                WHEN BestCaseId = 3 
                THEN 3 
                WHEN BestCaseId = 4 
                THEN 1 
                WHEN BestCaseId = 5 
                THEN 2 
                WHEN BestCaseId = 6 
                THEN 3 
                END);';
            EXEC(@tmpSQl);
        END
    ELSE
        PRINT 'Column BestCaseId is not exist';

    将上述语句拼装成SQL字符串再执行。(注意:VARCHAR的长度限制)

    上述数据库环境为:MSSQL 2012 R2。

  • 相关阅读:
    SHA1 VS RSA: what's the difference between them?
    TLS Security
    TLS Handshake Protocol
    Building Cython code
    Getting started with JupyterLab
    Installing Cython
    【转贴】libcrypto.so.10丢失导致sshd无法运行解决方案
    [Typescript] Function Overloads
    [Typescript] Function Generics
    [Typescript] Discriminated (Tagged) Unions
  • 原文地址:https://www.cnblogs.com/Interkey/p/sql_issue_one.html
Copyright © 2011-2022 走看看