/// <summary> /// Generates SQL for creating this table. /// </summary> /// <param name="dialect"></param> /// <param name="defaultCatalog">the default catalog name</param> /// <param name="defaultSchema">the default schema name</param> /// <returns>an SQL string</returns> public String ToSqlCreate(Dialect dialect, String defaultCatalog, String defaultSchema) { StringBuilder sb = StringHelper.CreateBuilder() .Append(HasPrimaryKey ? dialect.CreateTableString : dialect.CreateMultisetTableString) .Append(" ") .Append(GetQualifiedName(dialect, defaultCatalog, defaultSchema)) .Append(" ("); Boolean hasIdentity = false; StringHelper.AppendItemsWithComma(Columns, delegate(Column column) { // column info sb.Append(column.GetQuotedName(dialect)) .Append(" "); if (column.DbType == DbType.Identity) { hasIdentity = true; if (dialect.HasDataTypeInIdentityColumn) sb.Append(column.GetSqlType(dialect)); sb.Append(" ").Append(dialect.IdentityColumnString); } else { sb.Append(column.GetSqlType(dialect)); if (column.DefaultValue != null) sb.Append(" DEFAULT ").Append(column.DefaultValue); if (column.Nullable) sb.Append(dialect.NullColumnString); else sb.Append(" NOT NULL"); } // unique constraint if (column.Unique && (!column.Nullable || dialect.SupportsNullableUnique)) { if (dialect.SupportsUnique) sb.Append(" UNIQUE"); else { UniqueKey uk = GetOrCreateUniqueKey(column.GetQuotedName(dialect) + "_"); uk.AddColumn(column); } } // check constraint if (column.CheckConstraint != null && dialect.SupportsColumnCheck) sb.Append(" CHECK (") .Append(column.CheckConstraint) .Append(")"); // comment if (column.Comment != null) sb.Append(dialect.GetColumnComment(column.Comment)); }, sb); if (HasPrimaryKey && !(hasIdentity && dialect.HasPrimaryKeyInIdentityColumn)) sb.Append(", ") .Append(PrimaryKey.ToSqlConstraintString(dialect)); if (dialect.SupportsUniqueConstraintInCreateAlterTable) { foreach (UniqueKey uk in _uniqueKeys.Values) { String constraint = uk.ToSqlConstraintString(dialect); if (!String.IsNullOrEmpty(constraint)) sb.Append(", ").Append(constraint); } } // table check if (dialect.SupportsTableCheck) { foreach (String check in _checkConstraints) { sb.Append(", CHECK (").Append(check).Append(")"); } } sb.Append(")"); if (Comment != null) { sb.Append(dialect.GetTableComment(Comment)); } return sb.ToString(); }