Ideally, you have the primary key with the data. This is one of the key features in a relational database: the key consists of one or more columns in the data. For instance, if you have table with cars, you would use the license plate or the VIN (Vehicle Identification Number) as the key. Likewise, in a table of persons, you would use the national registration number. Exactly how depends on which country you are in, and what persons you need to handle. (That is, you may need to handle both natural and juridical persons, or only one of these.)
Sometimes, though, it can be difficult to identify a key that is practically useful as such, and in this case you may have to introduce a surrogate key. But this is not a step to take lightly. Particularly, you will need to find a way to make sure that you to don't enter the same car, person etc twice.
Surrogate keys can be GUIDs, which you can send from the client. But it is common to have an integer value that is computed in the database. Typically you do this getting the current max value and generate new ones with the row_number function:
INSERT tbl(id, ...)
OUTPUT inserted.*
SELECT @maxid + row_number() OVER(ORDER BY ...), col1, col2, col3
FROM @tvp
In this example I've added the OUTPUT clause which returns the rows inserted, so that you can get the ids. But you will need something in the input so that you can map the ids unambiguously.