各位大侠,小弟遇到一个棘手的问题:
我在SqlServer中有一个名为A的表。表里有个叫TEST的字段,Varchar型,默认值('')。
我在查询分析器中用以下代码出去删除表中的这个默认值,并将TEST更名为TEST_TEST(默认值(''))。关键代码如下:
  ALTER TABLE [A]
  DROP CONSTRAINT DF_A_TEST
……
  把TEST更名为TEST_TEST,并设默认值为('')
……
运行结果:OK。
这时我在对这个表再次进行处理,又执行到
  ALTER TABLE [A]
  DROP CONSTRAINT DF_A_TEST_TEST
……
这时分析器报错。说'DF_A_TEST_TEST' is not a constraint.
于是我把
  ALTER TABLE [A]
  DROP CONSTRAINT DF_A_TEST_TEST
注释掉,继续执行。运行结果OK。
然后我再把注释掉的
  ALTER TABLE [A]
  DROP CONSTRAINT DF_A_TEST_TEST
还原回来,再次执行,运行结果居然也OK了!!!如此反复,很有规律!呵呵不明白啊!!是不是我什么地方理解错了。请各位朋友指正!
如觉得100分太少,可以另行加分!

解决方案 »

  1.   

    你最好把你的脚本全部贴出来。如果是把TEST字段RENAME成TEST_TEST,照你的描述来看,根本就不存在一个constraint DF_A_TEST_TEST,怎么后来又可以DROP CONSTRAINT DF_A_TEST_TEST了呢。你肯定创建了CONSTRAINT DF_A_TEST_TEST。
      

  2.   

    是的,如果楼上的朋友仔细看了,那就是我没写清楚。再详细解释一下:
    主要分为三步,但每一步操作都是用同一种方法进行操作。
    第一步:我把表中TEST更名为了TEST_TEST,其它的属性都没有变(类型、默认值等)。运行结果OK。
    第二步:我对更名后的表执行一次脚本。运行出错,告知:TEST_TEST这个字段不是CONSTRAINT(说明:在第一步时其实已经写了)。这时,只需注释掉ALTER TABLE [A] DROP CONSTRAINT DF_A_TEST_TEST,脚本就可以安全执行。运行结果OK。
    第三步:我再对更名后的表执行一次脚本,并将注释了的ALTER TABLE [A] DROP CONSTRAINT DF_A_TEST_TEST这句脚本还原回来,运行结果OK。问题大致就是这样的。如果还是不理解,请等一等,我中午就把源码贴上来。
      

  3.   

    表原始信息:
    名称     类型        默认值
    aa       varchar     ''
    b        varchar     ''
    c        varchar     ''
    d        datetime    
    e        int         0--第一步:(将b->bb,运行结果OK)
    Begin
    ALTER TABLE [aa]
    DROP CONSTRAINT DF_aa_b
    End
    Begin
    ALTER TABLE [aa]
    DROP CONSTRAINT DF_aa_c
    End
    Begin
    CREATE TABLE [Tmp_aa] (
    [aa] [varchar] (50) NOT NULL ,
    [bb] [varchar] (50) NOT NULL ,
    [c] [varchar] (50) NOT NULL ,
    [d] [datetime] Null ,
    [e] [int] NOT NULL 
    ) ON [PRIMARY]
    End
    Begin
    ALTER TABLE Tmp_aa ADD CONSTRAINT [DF_aa_b] DEFAULT ('') FOR [bb]
    End
    Begin
    ALTER TABLE Tmp_aa ADD CONSTRAINT [DF_aa_c] DEFAULT ('') FOR [c]
    EndBEGIN
    --SET IDENTITY_INSERT Tmp_aa ON
    IF EXISTS(SELECT * FROM [aa])
    BEGIN
    EXEC('INSERT INTO Tmp_aa (aa,bb,c,d,e)
    SELECT CONVERT(varchar(50),aa),CONVERT(varchar(50),b),CONVERT(varchar(50),c),CONVERT(datetime,d),CONVERT(int(10,0),e) FROM aa TABLOCKX')
    END
    --SET IDENTITY_INSERT Tmp_aa OFF
    END
    Begin
    DROP TABLE [aa]
    End
    Begin
    EXECUTE sp_rename N'Tmp_aa', N'aa', 'OBJECT'
    End
    Begin
    ALTER TABLE [aa] ADD CONSTRAINT [PK_aa] PRIMARY KEY CLUSTERED ([aa])
     ON [PRIMARY]
    End--第二步:(修改后的表再存一次盘,报错!说DF_aa_bb不是CONSTRAINT,于是将
    Begin
    ALTER TABLE [aa]
    DROP CONSTRAINT DF_aa_bb
    End
    注释,执行成功!)
    Begin
    ALTER TABLE [aa]
    DROP CONSTRAINT DF_aa_bb
    End
    Begin
    ALTER TABLE [aa]
    DROP CONSTRAINT DF_aa_c
    End
    Begin
    CREATE TABLE [Tmp_aa] (
    [aa] [varchar] (50) NOT NULL ,
    [bb] [varchar] (50) NOT NULL ,
    [c] [varchar] (50) NOT NULL ,
    [d] [datetime] Null ,
    [e] [int] NOT NULL 
    ) ON [PRIMARY]
    End
    Begin
    ALTER TABLE Tmp_aa ADD CONSTRAINT [DF_aa_bb] DEFAULT ('') FOR [bb]
    End
    Begin
    ALTER TABLE Tmp_aa ADD CONSTRAINT [DF_aa_c] DEFAULT ('') FOR [c]
    EndBEGIN
    --SET IDENTITY_INSERT Tmp_aa ON
    IF EXISTS(SELECT * FROM [aa])
    BEGIN
    EXEC('INSERT INTO Tmp_aa (aa,bb,c,d,e)
    SELECT CONVERT(varchar(50),aa),CONVERT(varchar(50),bb),CONVERT(varchar(50),c),CONVERT(datetime,d),CONVERT(int(10,0),e) FROM aa TABLOCKX')
    END
    --SET IDENTITY_INSERT Tmp_aa OFF
    END
    Begin
    DROP TABLE [aa]
    End
    Begin
    EXECUTE sp_rename N'Tmp_aa', N'aa', 'OBJECT'
    End
    Begin
    ALTER TABLE [aa] ADD CONSTRAINT [PK_aa] PRIMARY KEY CLUSTERED ([aa])
     ON [PRIMARY]
    End--第三步:(再一次对表进行存盘,恢复第二步注释的内容,运行结果OK)
    Begin
    ALTER TABLE [aa]
    DROP CONSTRAINT DF_aa_bb
    End
    Begin
    ALTER TABLE [aa]
    DROP CONSTRAINT DF_aa_c
    End
    Begin
    CREATE TABLE [Tmp_aa] (
    [aa] [varchar] (50) NOT NULL ,
    [bb] [varchar] (50) NOT NULL ,
    [c] [varchar] (50) NOT NULL ,
    [d] [datetime] Null ,
    [e] [int] NOT NULL 
    ) ON [PRIMARY]
    End
    Begin
    ALTER TABLE Tmp_aa ADD CONSTRAINT [DF_aa_bb] DEFAULT ('') FOR [bb]
    End
    Begin
    ALTER TABLE Tmp_aa ADD CONSTRAINT [DF_aa_c] DEFAULT ('') FOR [c]
    EndBEGIN
    --SET IDENTITY_INSERT Tmp_aa ON
    IF EXISTS(SELECT * FROM [aa])
    BEGIN
    EXEC('INSERT INTO Tmp_aa (aa,bb,c,d,e)
    SELECT CONVERT(varchar(50),aa),CONVERT(varchar(50),bb),CONVERT(varchar(50),c),CONVERT(datetime,d),CONVERT(int(10,0),e) FROM aa TABLOCKX')
    END
    --SET IDENTITY_INSERT Tmp_aa OFF
    END
    Begin
    DROP TABLE [aa]
    End
    Begin
    EXECUTE sp_rename N'Tmp_aa', N'aa', 'OBJECT'
    End
    Begin
    ALTER TABLE [aa] ADD CONSTRAINT [PK_aa] PRIMARY KEY CLUSTERED ([aa])
     ON [PRIMARY]
    End
    为什么会出现上述情况呢?是不是我什么地方理解错了?或代码写错了?
    请各位大侠赐教!期待中……