org-table-sort-lines does not return the sorted table as your first formula assumes: instead, it operates by side-effect, modifying the table in place. It just so happens that the last thing it calls is (move-column 2) to move the cursor to the second column (of the screen, not the table - I'm oversimplifying here, but the details really don't matter much), and that function returns the column number (in this case 2). That is then the value assigned to the whole of the first column. Turn on formula debugging with C-c { to see what it's doing: you'll see that it sorts the table in a first pass and then assigns 2 to the first column when you continue.
Your second formula "mostly works" because it's only affecting directly the top row of the table: again, the table is sorted by side-effect and then the value it returns is assigned to the @1$1 cell of the table. What you really want to do is to throw away the result, but I don't know of a way to do that.
As in your other question, however, I suggest you do NOT use formulas for such operations. You can interactively sort the table once and for all: you do not need to do that from a formula.
EDIT: Here is an implementation of my suggestion to use a source code block:
#+name: animals
| Animal | Nombre |
|----------+--------|
| Bison | 5 |
| Vache | 4 |
| Aligator | 7 |
| Chèvre | 4 |
| Wapiti | 6 |
| Sanglier | 41 |
| Porc | 0 |
#+begin_src elisp :var tbl=animals :colnames yes
(sort tbl (lambda (x y) (string-lessp (car x) (car y)))))
#+end_src
#+RESULTS:
| Animal | Nombre |
|----------+--------|
| Aligator | 7 |
| Bison | 5 |
| Chèvre | 4 |
| Porc | 0 |
| Sanglier | 41 |
| Vache | 4 |
| Wapiti | 6 |
This depends on the fact that the table is represented in lisp as a list of rows and each row is a list of cells, with non-numeric cells represented as strings , e.g. the above table is represented like this:
(("Bison" 5) ("Vache" 4) ("Aligator" 7) ("Chèvre 4) ("Wapiti" 6) ("Sanglier" 41) ("Porc" 0))
The sort function sorts a list using a predicate, i.e. a function that takes two arguments and returns non-nil if the first argument should sort before the second. In our case, the elements are two-element lists and we need to take the car of each element to get the names, which we compare using string-lessp. Do C-h v sort to find out more about the sort function.
org-sort(C-c ^)while your cursor is on the table.