gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:55:18 25 4
gpt4 key购买 nike

我在 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)");
}

这是我的异常(exception):

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)

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

最佳答案

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

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

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

回复:如何放弃所有限制

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

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())

引用:基于this query here ,但扩展到所有约束

SqlFiddle Here

关于java - 更改 SQL Server DB 中列的数据类型时出错 - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23371132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com