Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更改SQL Server DB-Java中列的数据类型时出错_Java_Sql_Sql Server_Sqldatatypes - Fatal编程技术网

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

更改SQL Server DB-Java中列的数据类型时出错,java,sql,sql-server,sqldatatypes,Java,Sql,Sql Server,Sqldatatypes,我用Java做了一个查询,它改变了一列中另一列的数据类型。在尝试更改类型之前,它工作正常。它查找数据库中具有指定数据类型的所有列,但无法更改它 这是我的密码: st = conn.createStatement(); rs = st.executeQuery("SELECT a.name as ColName, o.name AS TableName" + "FROM sys.syscolumns AS a"

我用Java做了一个查询,它改变了一列中另一列的数据类型。在尝试更改类型之前,它工作正常。它查找数据库中具有指定数据类型的所有列,但无法更改它

这是我的密码:

        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)

有人知道这是怎么回事吗?我能做些什么?

首先,我对上面的尖刻评论表示歉意

收到此错误的原因是您的alter脚本没有对约束执行任何操作。除非首先删除约束,否则无法修改作为约束目标的列(
唯一、外键、默认值等)。在这种情况下,您可能需要在以后添加约束

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

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)时会获得正确的依赖顺序,因此我们基本上会消除错误,并尝试删除另一个随机约束(
order BY NEWID()

参考:基于但扩展到所有约束


您的alter脚本没有对约束执行任何操作。除非先删除约束,否则无法修改作为约束(唯一、外键、默认等)目标的列。在这种情况下,您可能需要在以后重新添加约束。@StuartLC我完成了所有操作,效果很好。谢谢但现在我有另一个问题。它会更改某些列,而不是所有列。我的问题的链接是,因为这里有一个很长的问题。如果你介意的话。谢谢