Skip to content

Commit

Permalink
0005496 : Optionally cast varchar to nvarchar (#187)
Browse files Browse the repository at this point in the history
* Ensure schema is given on table drop

* Add option to cast from varchar to nvarchar

* Change if-statement to StringUtils.isNotBlank()
  • Loading branch information
scornelissen85 committed Oct 3, 2022
1 parent 57a3de0 commit eb4d3dc
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 2 deletions.
Expand Up @@ -142,6 +142,7 @@ protected void createTable(Table table, StringBuilder ddl, boolean temporary, bo
@Override
protected void dropTable(Table table, StringBuilder ddl, boolean temporary, boolean recreate) {
String tableName = getTableName(table.getName());
String schema = table.getSchema();
String tableNameVar = "tn" + createUniqueIdentifier();
String constraintNameVar = "cn" + createUniqueIdentifier();
writeQuotationOnStatement(ddl);
Expand Down Expand Up @@ -169,6 +170,10 @@ protected void dropTable(Table table, StringBuilder ddl, boolean temporary, bool
println(" CLOSE refcursor", ddl);
println(" DEALLOCATE refcursor", ddl);
ddl.append(" DROP TABLE ");
if (StringUtils.isNotBlank(schema)) {
printIdentifier(schema, ddl);
ddl.append(".");
}
printlnIdentifier(tableName, ddl);
ddl.append("END");
printEndOfStatement(ddl);
Expand Down
Expand Up @@ -21,10 +21,10 @@
package org.jumpmind.db.platform.mssql;

import java.sql.Types;
import java.util.Map;

import org.jumpmind.db.model.Column;
import org.jumpmind.db.model.Table;
import org.jumpmind.db.model.TypeMap;
import org.jumpmind.db.platform.DatabaseNamesConstants;

public class MsSql2005DdlBuilder extends MsSql2000DdlBuilder {
Expand Down Expand Up @@ -88,8 +88,9 @@ protected void dropColumnChangeDefaults(Table sourceTable, Column sourceColumn,

@Override
public String getSqlType(Column column) {
boolean useVarcharForText = System.getProperty("mssql.use.varchar.for.lob", "false").equalsIgnoreCase("true");
String sqlType = super.getSqlType(column);
boolean useVarcharForText = System.getProperty("mssql.use.varchar.for.lob", "false").equalsIgnoreCase("true");
boolean useNvarChar = System.getProperty("mssql.use.ntypes.for.chars", "false").equalsIgnoreCase("true");
if (column.getMappedTypeCode() == Types.VARBINARY && column.getSizeAsInt() > 8000) {
sqlType = "VARBINARY(MAX)";
} else if (column.getMappedTypeCode() == Types.VARCHAR && column.getSizeAsInt() > 8000) {
Expand All @@ -100,9 +101,19 @@ public String getSqlType(Column column) {
sqlType = String.format("DECIMAL(38,%d)", column.getScale());
} else if (useVarcharForText && (column.getMappedTypeCode() == Types.LONGVARCHAR || column.getMappedTypeCode() == Types.LONGNVARCHAR || column
.getMappedTypeCode() == Types.CLOB)) {
column.setMappedType(TypeMap.VARCHAR);
column.setSize("10000"); // Ensure the size is set to max
sqlType = (column.getMappedTypeCode() == Types.LONGNVARCHAR) ? "N" : "";
sqlType += "VARCHAR(MAX)";
}
if (useNvarChar && column.getMappedTypeCode() == Types.VARCHAR) {
int intColumnSize = 2 * column.getSizeAsInt(); // As every character in MSSQL takes at least 2 bytes in N-types, we have to double the size.
String strColumnSize = String.valueOf(intColumnSize);
if (intColumnSize > 4000) {
strColumnSize = "max";
}
sqlType = String.format("NVARCHAR(%s)", strColumnSize);
}
return sqlType;
}
}

0 comments on commit eb4d3dc

Please sign in to comment.