Find all variables in SQL script
It’s quite easy to use General SQL Parser to find out all SQL variables in a SQL script. It will not only find variables in declare statement but also find variables where it was used.
This is a query includes SQL variables
DECLARE @ProductId BIGINT DECLARE @OTSProductId BIGINT SET @ProductId = 35768 SET @OTSProductId = @ProductId IF NOT EXISTS(SELECT ProductId FROM PRODUCT WHERE PRODUCTID = @ProductId) BEGIN INSERT INTO [Product] ([ProductId], [Name]) SELECT @ProductId, 'Please see the insert in this bill ...' END ELSE BEGIN PRINT REPLACE('productalready exists', ' ', @ProductId) END
All SQL varaibles found in that SQL script
@ProductId @OTSProductId @ProductId @OTSProductId @ProductId @ProductId @ProductId @ProductId
Even more, General SQL Parser can find variable used throughout the whole stored procedure to extract a lineage.
Take this SQL for example
CREATE PROCEDURE STGTRSODS.P_LOAD_DC_UNIVL_PLAN_R2_R3 ( IN in_cycle_id CHAR(2)) RESULT SETS 1 LANGUAGE SQL P1: BEGIN ------------------------------------------------------------------------ -- DECLARE SECTION ------------------------------------------------------------------------ DECLARE SQLSTATE CHAR(5); DECLARE wk_sqlstate CHAR(5) DEFAULT '00000'; DECLARE cs_VALUE CHARACTER(100); DECLARE wk_fetch_status CHAR(5) DEFAULT '00000'; DECLARE cs_PLAN_NUM CHARACTER(6); DECLARE cs_SUB_PLAN CHARACTER(6); --CLARE cs_if_cursor CURSOR WITH HOLD WITH RETURN FOR cs_if_cursor; SET wk_stg_cfe_r3 = ACCTLOAD.F_GET_ETL_TABLE(in_cycle_id,'ACCTLOAD.T_STG_CFE_$$$_R3'); SET wk_stg_cfe_r2 = ACCTLOAD.F_GET_ETL_TABLE(in_cycle_id,'ACCTLOAD.T_STG_CFE_$$$_R2'); FETCH cs_if_cursor INTO cs_PLAN_NUM, cs_SUB_PLAN, cs_KEY_WORD, cs_VALUE; WHILE (wk_fetch_status = '00000') DO CASE cs_KEY_WORD WHEN 'DSHR PARTICIPATING DATASHARE INDICATOR' THEN IF EXISTS(SELECT 1 FROM SESSION.GLBLTMP_R3_R2 WHERE PLAN_NUM = cs_PLAN_NUM AND SUB_PLAN = cs_SUB_PLAN) THEN UPDATE SESSION.GLBLTMP_R3_R2 SET DSHR_PARTICIPATING_IND = SUBSTR(cs_VALUE,1,1) WHERE PLAN_NUM = cs_PLAN_NUM AND SUB_PLAN = cs_SUB_PLAN; ELSE INSERT INTO SESSION.GLBLTMP_R3_R2 (PLAN_NUM,SUB_PLAN, DSHR_PARTICIPATING_IND, DSHR_FUNCTION) VALUES (cs_PLAN_NUM,cs_SUB_PLAN, SUBSTR(cs_VALUE,1,1), NULL); END IF; WHEN 'DSHR DATASHARE FUNCTION' THEN IF EXISTS(SELECT 1 FROM SESSION.GLBLTMP_R3_R2 WHERE PLAN_NUM = cs_PLAN_NUM AND SUB_PLAN = cs_SUB_PLAN) THEN UPDATE SESSION.GLBLTMP_R3_R2 SET DSHR_FUNCTION = SUBSTR(cs_VALUE,1,1) WHERE PLAN_NUM = cs_PLAN_NUM AND SUB_PLAN = cs_SUB_PLAN; ELSE INSERT INTO SESSION.GLBLTMP_R3_R2 (PLAN_NUM,SUB_PLAN, DSHR_PARTICIPATING_IND, DSHR_FUNCTION) VALUES (cs_PLAN_NUM,cs_SUB_PLAN, NULL, SUBSTR(cs_VALUE,1,1)); END IF; END CASE; END WHILE; END P1
Analyzed result will like this:
procedure name: STGTRSODS.P_LOAD_DC_UNIVL_PLAN_R2_R3 Variable: wk_sqlstate , Type: CHAR(5) Variable: cs_VALUE , Type: CHARACTER(100) Variable: wk_fetch_status , Type: CHAR(5) Variable: cs_PLAN_NUM , Type: CHARACTER(6) Variable: cs_SUB_PLAN , Type: CHARACTER(6) variable: cs_VALUE update table: SESSION.GLBLTMP_R3_R2 column: DSHR_PARTICIPATING_IND value: SUBSTR(cs_VALUE,1,1) variable: cs_PLAN_NUM insert table: SESSION.GLBLTMP_R3_R2 column: PLAN_NUM insert value: cs_PLAN_NUM variable: cs_SUB_PLAN insert table: SESSION.GLBLTMP_R3_R2 column: SUB_PLAN insert value: cs_SUB_PLAN variable: cs_VALUE insert table: SESSION.GLBLTMP_R3_R2 column: DSHR_PARTICIPATING_IND insert value: SUBSTR(cs_VALUE,1,1) variable: cs_VALUE update table: SESSION.GLBLTMP_R3_R2 column: DSHR_FUNCTION value: SUBSTR(cs_VALUE,1,1) variable: cs_PLAN_NUM insert table: SESSION.GLBLTMP_R3_R2 column: PLAN_NUM insert value: cs_PLAN_NUM variable: cs_SUB_PLAN insert table: SESSION.GLBLTMP_R3_R2 column: SUB_PLAN insert value: cs_SUB_PLAN variable: cs_VALUE insert table: SESSION.GLBLTMP_R3_R2 column: DSHR_FUNCTION insert value: SUBSTR(cs_VALUE,1,1)
Download this demo: C# version