Skip to content

Commit 05c08e4

Browse files
committed
update script
1 parent 32f63ad commit 05c08e4

1 file changed

Lines changed: 187 additions & 12 deletions

File tree

TSQL_data_lineage.sql

Lines changed: 187 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,11 @@ GO
1010

1111
CREATE OR ALTER FUNCTION dbo.fn_removelistChars
1212
/*
13-
Desc: Function for removing list of unwanted characters
13+
Author: Tomaz Kastrun
1414
Created: 06.JUN.2022
15-
Author: TK
15+
16+
Desc: Function for removing list of unwanted characters
17+
1618
Usage:
1719
SELECT dbo.fn_removelistChars('Tol~99""''''j\e.j/e[,t&eks]t,ki')
1820
@@ -33,7 +35,7 @@ GO
3335

3436

3537

36-
CREATE OR ALTER dbo.TSQL_data_lineage
38+
CREATE OR ALTER PROCEDURE dbo.TSQL_data_lineage
3739
/*
3840
Author: Tomaz Kastrun
3941
Date: 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
206346
END;
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

Comments
 (0)