Scan SQL stored procedures/udfs/views, return the table name with columns
Iterate through SQL stored procedures, udfs, and views returning the table name with column names referenced by SELECT, WHERE, ORDER BY, GROUP BY, and JOIN.
Feed this demo with a SQL script file, generate output like this in stdout or in a text file.
scantable test.sql
Table Name: <Table Name1> SELECT: <ColumnName1>, <ColumnName3> WHERE: <ColumnName1>, <ColumnName2> ORDER BY: <ColumnName> GROUP BY: <ColumnName> JOIN: <ColumName>, <ColumnName2> Table Name: <Table Name2> SELECT: <ColumnName> WHERE: <ColumnName1>, <ColumnName2> ORDER BY: <ColumnName> GROUP BY: <ColumnName> JOIN: <ColumName>
Let’s take this SQL for example:
CREATE FUNCTION dbo.ufnGetStock(@ProductID int)
RETURNS int
AS
-- Returns the stock level for the product.
BEGIN
DECLARE @ret int;
SELECT @ret = SUM(p.Quantity)
FROM Production.ProductInventory p
WHERE p.ProductID = @ProductID
AND p.LocationID = '6';
IF (@ret IS NULL)
SET @ret = 0
RETURN @ret
END;
GO
USE AdventureWorks;
GO
SELECT ProductModelID, Name, dbo.ufnGetStock(ProductID)AS CurrentSupply
FROM Production.Product
WHERE ProductModelID BETWEEN 75 and 80;
GO
-- Table-Valued Functions
USE AdventureWorks;
GO
CREATE FUNCTION Sales.fn_SalesByStore (@storeid int)
RETURNS TABLE
AS
RETURN
(
SELECT P.ProductID, P.Name, SUM(SD.LineTotal) AS 'YTD Total'
FROM Production.Product AS P
JOIN Sales.SalesOrderDetail AS SD ON SD.ProductID = P.ProductID
JOIN Sales.SalesOrderHeader AS SH ON SH.SalesOrderID = SD.SalesOrderID
WHERE SH.CustomerID = @storeid
GROUP BY P.ProductID, P.Name
);
GO
SELECT * FROM Sales.fn_SalesByStore (602);
USE AdventureWorks;
GO
CREATE FUNCTION dbo.fn_FindReports (@InEmpID INTEGER)
RETURNS @retFindReports TABLE
(
EmployeeID int primary key NOT NULL,
Name nvarchar(255) NOT NULL,
Title nvarchar(50) NOT NULL,
EmployeeLevel int NOT NULL,
Sort nvarchar (255) NOT NULL
)
--Returns a result set that lists all the employees who report to the
--specific employee directly or indirectly.*/
AS
BEGIN
WITH DirectReports(Name, Title, EmployeeID, EmployeeLevel, Sort) AS
(SELECT CONVERT(Varchar(255), c.FirstName + ' ' + c.LastName),
e.Title,
e.EmployeeID,
1,
CONVERT(Varchar(255), c.FirstName + ' ' + c.LastName)
FROM HumanResources.Employee AS e
JOIN Person.Contact AS c ON e.ContactID = c.ContactID
WHERE e.EmployeeID = @InEmpID
UNION ALL
SELECT CONVERT(Varchar(255), REPLICATE ('| ' , EmployeeLevel) +
c.FirstName + ' ' + c.LastName),
e.Title,
e.EmployeeID,
EmployeeLevel + 1,
CONVERT (Varchar(255), RTRIM(Sort) + '| ' + FirstName + ' ' +
LastName)
FROM HumanResources.Employee as e
JOIN Person.Contact AS c ON e.ContactID = c.ContactID
JOIN DirectReports AS d ON e.ManagerID = d.EmployeeID
)
-- copy the required columns to the result of the function
INSERT @retFindReports
SELECT EmployeeID, Name, Title, EmployeeLevel, Sort
FROM DirectReports
RETURN
END;
GO
-- Example invocation
SELECT EmployeeID, Name, Title, EmployeeLevel
FROM dbo.fn_FindReports(109)
ORDER BY Sort;
Output generated by this tool is:
Table Name: Sales.SalesOrderDetail SELECT LIST: LineTotal JOIN: ProductID, SalesOrderID Table Name: Sales.SalesOrderHeader WHERE: CustomerID JOIN: SalesOrderID Table Name: DirectReports SELECT LIST: EmployeeID, Name, Title, EmployeeLevel, Sort JOIN: EmployeeID Table Name: HumanResources.Employee SELECT LIST: Title, EmployeeID, EmployeeLevel, Sort, FirstName, LastName WHERE: EmployeeID JOIN: ContactID, ManagerID Table Name: Production.ProductInventory SELECT LIST: Quantity WHERE: ProductID, LocationID Table Name: Production.Product SELECT LIST: ProductModelID, Name, ProductID WHERE: ProductModelID GROUP BY: ProductID, Name JOIN: ProductID Table Name: Person.Contact SELECT LIST: FirstName, LastName JOIN: ContactID
Download this tool with source code: .NET version, Java version

