更改 SQL Server DB 中列的数据类型时出错 - Java

Posted

技术标签:

【中文标题】更改 SQL Server DB 中列的数据类型时出错 - Java【英文标题】:Error when changing datatype of column in SQL Server DB - Java 【发布时间】:2014-06-15 18:33:01 【问题描述】:

我在 Java 中进行了一个查询,该查询更改了另一列的数据类型。在尝试更改类型之前它工作正常。它会查找 DB 中具有指定数据类型的所有列,但不能更改它。

这是我的代码:

        st = conn.createStatement();
        rs = st.executeQuery("SELECT a.name as ColName, o.name AS TableName"
                + "FROM sys.syscolumns AS a"
                + "INNER JOIN sys.systypes AS b ON a.xtype = b.xtype AND b.name = 'char' AND a.length = 255"
                + "INNER JOIN sys.objects AS o ON a.id = o.object_id WHERE (o.type = 'u') AND (o.schema_id = 1)");
        ResultSet rsPom;
        while (rs.next())
            String tName=rs.getString("TableName");
            String cName=rs.getString("ColName");
            System.out.println(tName+"  "+cName);
            rsPom=st.executeQuery("ALTER TABLE "+ tName+" ALTER COLUMN "+cName+" nvarchar(255)");
        

这是我的例外:

com.microsoft.sqlserver.jdbc.SQLServerException: The object 'CK_TimeInstant_frame_default' is dependent on column 'frame'.
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:216)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1515)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.doExecuteStatement(SQLServerStatement.java:792)
at com.microsoft.sqlserver.jdbc.SQLServerStatement$StmtExecCmd.doExecute(SQLServerStatement.java:689)
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:5696)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1715)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:180)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:155)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeQuery(SQLServerStatement.java:616)
at DataTypeChanger.changeDataType(DataTypeChanger.java:50)
at DataTypeChanger.main(DataTypeChanger.java:36)

有谁知道这是怎么回事,我能做什么?

【问题讨论】:

您的修改脚本没有对约束采取任何行动。除非首先删除约束,否则不能修改作为约束目标的列(唯一、外键、默认等)。在这种情况下,您可能需要在之后添加约束。 @StuartLC 我做到了,一切正常。谢谢。但现在我还有其他问题。它改变了一些列,而不是全部。我的问题的链接是 ***.com/questions/23366393/… ,因为这里的问题很长。如果你介意的话。谢谢。 【参考方案1】:

首先,对于上面的尖刻评论,我深表歉意。

您收到此错误的原因是您的 alter 脚本未对约束采取任何操作。除非首先删除约束,否则不能修改作为约束目标的列(Unique, Foreign Key, Default 等)。 在这种情况下,您可能需要在之后重新添加约束。

我假设您之前(已删除)的评论仍然有效,即您不需要在删除约束后再次创建约束。

Re : 如何删除所有约束

免责声明:在尝试此操作之前备份您的数据库,但以下 可能 工作。这是一种破坏性的单向操作。

declare @sql nvarchar(2000);
while(exists(select 1 from sys.objects WHERE type_desc LIKE '%CONSTRAINT%'))
begin
    BEGIN TRY
      SELECT TOP 1 @sql=('ALTER TABLE ' + SCHEMA_NAME(schema_id) + '.[' + OBJECT_NAME(parent_object_id)
      + '] DROP CONSTRAINT [' + OBJECT_NAME(OBJECT_ID) + ']')
      FROM sys.objects
      WHERE type_desc LIKE '%CONSTRAINT%'
      ORDER BY NEWID();
      exec (@sql);
    END TRY
    BEGIN CATCH
    END CATCH
end;
GO

基本原理:TRY CATCH 是必需的,因为不能保证在删除约束(例如 FK 依赖于 PK)时我们会得到正确的依赖顺序,所以我们基本上消除了错误并尝试删除另一个随机约束(@ 987654326@)

参考:基于this query here,但扩展到所有约束

SqlFiddle Here

【讨论】:

以上是关于更改 SQL Server DB 中列的数据类型时出错 - Java的主要内容,如果未能解决你的问题,请参考以下文章

更改增量表中列的数据类型

更改 SQL 列的数据类型时更新 SSIS 包

更改数据库中列的数据类型

如何更改 BigQuery 中列的数据类型

是否可以更改视图中列的数据类型?

SQL Server 表未显示表中列的值