Number of options here:
You can use IDENTITY. That will allocate the next available number to each new record inserted into the table. However, if a record is rolled back (e.g. some error, or deadlock, during INSERT) the number will be "consumed" and will not be allocated again. So the numbers will be unique but not necessarily contiguous.
You can do a query for
MAX(MyInvoiceNoColumn) and then add one to make the next number. This is usually not a good idea because it blocks multiple people trying to insert new rows at the same time.
There are SEQUENCE numbers avail in recent versions of SQL - which might suit your need.
If you import your data using SSIS then you either need to assign the Invoice Number using some code in SSIS (which includes calling a Stored Procedure) or, alternatively, you could create a TRIGGER on the target table which automatically assigned the "next available number" to any newly inserted row (using whatever method, to calculate the "next number" that you decide). The benefit of this method is that ANYTHING that can insert into the table will automatically get the next-available-number, so you won't have that logic duplicated in multiple places. If you don't want this to "always" happen you could use a Stored Procedure instead - that would only apply when new rows were inserted using the Stored Procedure, so you could import data "in other ways" that did not use the Stored Procedure and therefore did not assign invoice numbers automatically.
I recommend that you create a UNIQUE INDEX on the Invoice Number column, that will ensure that there are no duplicates. If you need to allow some rows to have NO Invoice Number then you would need to use a Filtered Unique Index which excludes rows
WHERE MyInvoiceNoColumn IS NULL