1010
1111CREATE OR ALTER FUNCTION dbo .fn_removelistChars
1212/*
13- Desc: Function for removing list of unwanted characters
13+ Author: Tomaz Kastrun
1414Created: 06.JUN.2022
15- Author: TK
15+
16+ Desc: Function for removing list of unwanted characters
17+
1618Usage:
1719 SELECT dbo.fn_removelistChars('Tol~99""''''j\e.j/e[,t&eks]t,ki')
1820
3335
3436
3537
36- CREATE OR ALTER dbo .TSQL_data_lineage
38+ CREATE OR ALTER PROCEDURE dbo .TSQL_data_lineage
3739/*
3840Author: Tomaz Kastrun
3941Date: August 2022
@@ -65,19 +67,43 @@ BEGIN
6567
6668
6769
68- DROP TABLE IF EXISTS dbo .SQL_query_table ;
70+ DROP TABLE IF EXISTS dbo .SQL_query_table
71+
72+ CREATE TABLE dbo .SQL_query_table (
73+ id INT IDENTITY (1 ,1 ) NOT NULL
74+ ,query_txt NVARCHAR (4000 )
75+ )
76+
77+ -- Breaks the procedure into lines with linebreak
78+ -- INSERT INTO dbo.SQL_query_table
79+ -- EXEC sp_helptext
80+ -- @objname = @InputQuery
81+
82+ -- Breaks the query into lines with linebreak
83+ DECLARE @MAX_nof_break INT = (select len (@InputQuery) - len (replace (@InputQuery, CHAR (10 ), ' ' )))
84+ DECLARE @start_nof_break INT = 1
85+ declare @iq2 NVARCHAR (max ) = @InputQuery
86+
87+ declare @max_len int = (SELECT len (@InputQuery))
88+ declare @start_pos int = 0
89+ declare @br_pos int = 0
90+
6991
70- CREATE TABLE dbo .SQL_query_table (
71- id INT IDENTITY (1 ,1 ) NOT NULL
72- ,query_txt NVARCHAR (4000 )
73- )
7492
75- INSERT INTO dbo .SQL_query_table
76- EXEC sp_helptext
77- @objname = @InputQuery
93+ while (@MAX_nof_break >= @start_nof_break)
94+ BEGIN
7895
96+ SET @br_pos = (SELECT charindex ( char (10 ), @iq2) )
97+ INSERT INTO dbo .SQL_query_table (query_txt)
98+ SELECT substring (@InputQuery,@start_pos, @br_pos )
99+
100+ SET @start_pos = @start_pos + @br_pos
101+ SET @iq2 = SUBSTRING (@InputQuery, @start_pos, @max_len)
102+ SET @start_nof_break = @start_nof_break + 1
103+ END
79104
80105
106+ -- - STart removing comments
81107 DECLARE @proc_text varchar (MAX ) = ' '
82108 DECLARE @proc_text_row varchar (MAX )
83109 DECLARE @proc_no_comment varchar (MAX ) = ' '
@@ -196,6 +222,120 @@ BEGIN
196222******************************** */
197223
198224
225+ DROP TABLE IF EXISTS TK_TEST2
226+
227+
228+ DECLARE @stmt NVARCHAR (MAX ) = (
229+
230+ SELECT
231+ sp_text_fin
232+ FROM #tbl_sp_no_comments_fin
233+ WHERE
234+ DATALENGTH(sp_text_fin) > 0
235+ AND LEN (sp_text_fin) > 0
236+ )
237+
238+ DECLARE @stmt2 NVARCHAR (4000 )
239+ SET @stmt2 = REPLACE (REPLACE (@stmt, CHAR (13 ), ' ' ), CHAR (10 ), ' ' )
240+
241+
242+ select
243+ TRIM (REPLACE (value , ' ' ,' ' )) as val
244+ ,dbo .fn_removelistChars (value ) as val_f
245+ ,row_number () over (ORDER BY (SELECT 1 )) as rn
246+ INTO TK_TEST2
247+ from string_split (REPLACE (@stmt2, CHAR (13 ), ' ' ), ' ' )
248+ WHERE
249+ REPLACE (value , ' ' ,' ' ) <> ' '
250+ OR REPLACE (value , ' ' ,' ' ) <> ' '
251+
252+
253+
254+
255+ SELECT
256+ *
257+ ,case when val like ' %(%' then 1 else 0 end as predok
258+ ,case when val like ' %)%' then 1 else 0 end as zak
259+ ,case when val like ' %select%' then 1 else 0 end as select_
260+ ,case when val like ' %FROM%' then 1 else 0 end as from_
261+ ,case when val like ' %join%' then 1 else 0 end as join_
262+ ,case when val like ' %where%' then 1 else 0 end as where_
263+ FROM TK_TEST2
264+
265+
266+
267+
268+
269+
270+ -- @token = @tokenen
271+ -- @token_i = @tokenen_i
272+
273+ DECLARE @table TABLE (tik varchar (100 ), tok varchar (100 ), order_ INT )
274+ DECLARE @token_i VARCHAR (100 ) = ' '
275+ DECLARE @get_next BIT = 0 -- FALSE (1 = TRUE)
276+ DECLARE @previous VARCHAR (100 ) = ' '
277+ DECLARE @order INT = 1
278+ DECLARE @previous_tik VARCHAR (100 ) = ' '
279+ DECLARE @previous_get BIT = 0 -- FALSE
280+
281+ DECLARE @ttok VARCHAR (100 ) = ' '
282+
283+
284+ DECLARE @i_row INT = 1
285+ DECLARE @max_row INT = (SELECT MAX (rn) FROM TK_TEST2)
286+ DECLARE @row_commands_1 NVARCHAR (1000 ) = ' select,delete,insert,drop,create,select,truncate,exec,execute'
287+ DECLARE @row_commands_2 NVARCHAR (1000 ) = ' select,not,if,exists,select'
288+ DECLARE @row_commands_3 NVARCHAR (1000 ) = ' from,join,into,table,exists,sys.dm_exec_sql,exec,execute'
289+
290+
291+
292+ WHILE (@max_row >= @i_row)
293+ BEGIN
294+ DECLARE @token VARCHAR (1000 ) = (SELECT val FROM TK_TEST2 WHERE rn = @i_row)
295+
296+ IF @token IN (SELECT REPLACE (TRIM (LOWER (value )), ' ' ,' ' ) FROM STRING_SPLIT (@row_commands_1, ' ,' ))
297+ BEGIN
298+ IF LOWER (@token) = ' select'
299+ BEGIN
300+ SET @token = ' select'
301+ END
302+ SET @token_i = @token
303+ END
304+ IF (@get_next = 1 )
305+ BEGIN
306+ IF @token NOT IN (SELECT REPLACE (TRIM (LOWER (value )), ' ' ,' ' ) FROM STRING_SPLIT (@row_commands_2,' ,' ))
307+ BEGIN
308+ IF (LOWER (@previous) = ' into' )
309+ SET @token_i = ' select into'
310+ IF (@token NOT LIKE ' %#%' OR @token NOT LIKE ' %#%' )
311+
312+ SET @ttok = ' ' + @token + ' as ('
313+ -- IF (@ttok NOT IN (SELECT @token))
314+ IF (@ttok NOT IN (SELECT @stmt2))
315+ INSERT INTO @table (tik, tok, order_)
316+ SELECT @token_i, @token, @order
317+
318+ SET @token_i = @token_i
319+ END
320+ SET @get_next = 0
321+ IF @token = ' sys.dm_exec_sql_text'
322+ BEGIN
323+ SET @get_next = 1
324+ END
325+ END
326+ IF (@token IN (SELECT REPLACE (TRIM (LOWER (value )), ' ' ,' ' ) FROM STRING_SPLIT (@row_commands_3,' ,' )))
327+ BEGIN
328+ SET @get_next = 1
329+ END
330+
331+ SET @previous_tik = @token_i
332+ SET @previous = @token
333+
334+ SET @i_row = @i_row + 1
335+ END
336+
337+ -- Final results
338+ SELECT * , row_number () over (order by (select 1 )) as rn FROM @table
199339
200340
201341
@@ -204,4 +344,39 @@ BEGIN
204344
205345-- END of procedure
206346END ;
207- GO
347+ GO
348+
349+
350+
351+
352+
353+ -- TEST
354+
355+ declare @test_query VARCHAR (8000 ) = '
356+
357+ SELECT
358+ s.[BusinessEntityID]
359+ ,p.[Title]
360+ ,p.[FirstName]
361+ ,p.[MiddleName]
362+ ,p.[LastName]
363+ ,p.[Suffix]
364+ ,e.[JobTitle] as imeSluzbe
365+ ,p.[EmailPromotion]
366+ ,s.[SalesQuota]
367+ ,s.[SalesYTD]
368+ ,s.[SalesLastYear]
369+ ,( SELECT GETDATE() ) AS DateNow
370+ ,( select count(*) FROM [AdventureWorks2014].sales.[SalesPerson] ) as totalSales
371+
372+ FROM [AdventureWorks2014].sales.[SalesPerson] s
373+ LEFT JOIN [AdventureWorks2014].[HumanResources].[Employee] e
374+ ON e.[BusinessEntityID] = s.[BusinessEntityID]
375+ INNER JOIN [AdventureWorks2014].[Person].[Person] AS p
376+ ON p.[BusinessEntityID] = s.[BusinessEntityID]
377+
378+ '
379+
380+
381+ EXEC dbo .TSQL_data_lineage
382+ @InputQuery = @test_query
0 commit comments