code: private Sql[] generateMSSQLSql(AddPrimaryKeyStatementMSSQL statement, Database database, SqlGeneratorChain sqlGeneratorChain) {
      String sql;
      if (statement.getConstraintName() == null) {
        sql = "ALTER TABLE " + database.escapeTableName(statement.getCatalogName(), statement.getSchemaName(), statement.getTableName()) + " ADD PRIMARY KEY (" + database.escapeColumnNameList(statement.getColumnNames()) + ")";
      } else {
        sql = "ALTER TABLE " + database.escapeTableName(statement.getCatalogName(), statement.getSchemaName(), statement.getTableName()) + " ADD CONSTRAINT " + database.escapeConstraintName(statement.getConstraintName())+" PRIMARY KEY";
        if (!statement.isClustered()) {
          sql += " NONCLUSTERED";
        }
        sql += " (" + database.escapeColumnNameList(statement.getColumnNames()) + ")";
      }
  
      // the only new feature being added is support for fillFactor
      sql += " WITH (FILLFACTOR = " + statement.getFillFactor() + ")";
  
      if (StringUtils.trimToNull(statement.getTablespace()) != null && database.supportsTablespaces()) {
        sql += " ON "+statement.getTablespace();
      }
  
      if (statement.getForIndexName() != null) {
        sql += " USING INDEX "+database.escapeObjectName(statement.getForIndexCatalogName(), statement.getForIndexSchemaName(), statement.getForIndexName(), Index.class);
      }
  
      return new Sql[] {
          new UnparsedSql(sql, getAffectedPrimaryKey(statement))
      };
    }
docs: The extension's implementation is essentially a copy/paste of the default implementation, with the following changes:
  
  1) Removed other database platform specific logic other than MSSQL (purely to simplify)
  
  2) Added support for setting fillFactor
  
  @param statement
  @param database
  @param sqlGeneratorChain
  @return