I’m programming an application that queries SAP Business One databases, which are incredibly complex, riddled with cryptic table and column names left over from ancient times (including many interesting typos), and in some parts have quite bad database design.
To ease working with these, I use a large “view library” as I call it, which defines views upon views that bring a lot of clarity, eliminate repetition, and allow me to ultimately aggregate all data which my application needs in a specific screen into one or two views that the application needs to query.
This works very well and I’m happy with it.
(Yes really. The performance is usually great, and when it isn’t it can usually be fixed without much hassle and is almost always revealed to be related to a bad join or sub-query somewhere that would have caused the issue regardless of whether views are being used or not. I’ve only ever had one issue related to using views per se, which was MS SQL Server failing to optimize queries against one of the most complex views –perhaps the most complex in fact– which I was able to solve simply by turning the view into a procedure that materializes the results of a couple intermediate views first.)
Now in some new deployment variants of SAP Business One, I will lose the ability of creating arbitrary SQL views in the database. Bad news. I will however be allowed to run some read-only queries, via a limited subset of the SQL language…
This brought me to the question: is there a way to “flatten” an SQL view via MS SQL Server (any version), so that I automatically get a query that already has all nested views “resolved” to their definitions, recursively?
For instance, consider the following sequence of (highly simplified) view definitions:
create view myItems as select itemCode, itemName from Items create view myCustomers as select customerCode, customerName from Customers create view myOrders as select o.orderId, o.orderNumber, c.* from Orders o join myCustomers c on c.customerCode = o.customerCode create view myOrderLines as select l.lineId, l.lineNumber, o.*, i.* from OrderLines l join myOrders o on o.orderId = l.orderId join myItems i on i.itemCode = l.itemCode
I want the ability to get the “flat version” of let’s say
myOrderLines, which would be this:
select l.lineId, l.lineNumber, o.orderId, o.orderNumber, c.customerCode, c.customerName, i.itemCode, i.itemName from OrderLines l join Orders o on o.orderId = l.orderId join Customers c on c.customerCode = o.customerCode join Items i on i.itemCode = l.itemCode
Is such a thing possible?