First, to answer your question:
You do not want to use newid() to define your id field, as this will be recounted every time you use the view. Indeed, data integrity is the biggest problem.
select row_number() over (order by someStaticAndUniqueFieldLikeCreateDate) as ID, Field1, Field2, Field3 from tblA order by someStaticAndUniqueFieldLikeCreateDate
This only works if you order a field that will have a sequential order that will add new rows, for example the CreateDate field. If you do not have this, this identifier may be changed. Now, if you only need this identifier at runtime, and there is nothing that forever binds to them, row_number will be just strong. If you have unreliable data, you do not have a reliable identifier unless you create an additional table and do not use triggers to populate it.
Secondly, be careful with this with schemabinding . This is dangerous if used as shreds. Remember that once you create a view with schemabinding , you cannot completely change the schema of any base table. This means that you cannot make a varchar(50) a varchar(100) column without resetting and re-adding all views with with schemabinding . Yes, you can index a view that is related to schemabound, but there are certain trade-offs that you need to consider before you block, store, and barrel.
Eric
source share