From 13173886fb1cb5d224ed992c6d2639548a246927 Mon Sep 17 00:00:00 2001 From: enragedbunny Date: Mon, 3 Sep 2018 18:39:53 -0400 Subject: [PATCH 1/2] Add support for QueryDefinedTables Added a function to support iterating through sub-queries to identify table references when sub-queries are used as table definitions. Modified if statement to identify when this was the case and call the function to recursively go through the references. This worked on some of the example use cases I had where sub-queries were used in From statements. I have not extensively tested this functionality. I had not previously used functions to use recursion like this but used the example already there as an example. --- Test-SQLScripts.ps1 | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/Test-SQLScripts.ps1 b/Test-SQLScripts.ps1 index e18fdcd..1468d0c 100644 --- a/Test-SQLScripts.ps1 +++ b/Test-SQLScripts.ps1 @@ -99,7 +99,19 @@ begin { Return $TableReference.SchemaObject } } - + function Get-UpdatedTableFromQueryDefinedTable($QueryDefinedTable) { + Write-Verbose "Looks like a sub query was used, need to get into the sub queries..." + If ($QueryDefinedTable.QueryExpression) { + Get-UpdatedTableFromQueryDefinedTable $QueryDefinedTable.QueryExpression.FromClause.TableReferences + } Else { + Write-Verbose "closing recursion..." + If ($QueryDefinedTable.FirstTableReference) { + Get-UpdatedTableFromReferences $QueryDefinedTable.FirstTableReference + } Else { + Return $QueryDefinedTable.SchemaObject + } + } + } function Get-Statement ($Statement, $Keys) { $StatementObject = [PSCustomObject] @{ PSTypeName = "Parser.DOM.Statement" @@ -140,6 +152,10 @@ begin { $SchemaObject = Get-UpdatedTableFromReferences $statement.Queryexpression.fromclause.tablereferences.FirstTableReference $StatementObject.OnObjectSchema = $SchemaObject.SchemaIdentifier.Value $StatementObject.OnObjectName = $SchemaObject.BaseIdentifier.Value + } elseif ($ObjectType -eq "SelectStatement" -and $statement.Queryexpression.FromClause.TableReferences.QueryExpression -ne $null) { + $SchemaObject = Get-UpdatedTableFromQueryDefinedTable $statement.QueryExpression.FromClause.TableReferences + $StatementObject.OnObjectSchema = $SchemaObject.SchemaIdentifier.Value + $StatementObject.OnObjectName = $SchemaObject.BaseIdentifier.Value } else { try { $StatementObject.StatementType = $Statement.GetType().Name.ToString() From 71ce546b715012677c5a930961c44e7536f122af Mon Sep 17 00:00:00 2001 From: enragedbunny Date: Mon, 3 Sep 2018 18:51:53 -0400 Subject: [PATCH 2/2] Create QueryDefinedTable.sql Example for when a QueryDefinedTable is used. --- TestScripts/QueryDefinedTable.sql | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 TestScripts/QueryDefinedTable.sql diff --git a/TestScripts/QueryDefinedTable.sql b/TestScripts/QueryDefinedTable.sql new file mode 100644 index 0000000..018e2bc --- /dev/null +++ b/TestScripts/QueryDefinedTable.sql @@ -0,0 +1,7 @@ +SELECT sub.last_name, + sub.first_name +FROM (SELECT customer.last_name, + customer.first_name + FROM customer + WHERE customer.age > '30') AS sub +