Building Query based on Column name provided in another table












0















enter image description here



I want to build a dynamic query based on structure provided in another table.



Here is an example how I want to build query based on above table-



select tbl1.col1,tbl1.col2,
tbl2.t2col1,tbl2.t2col2,tbl2.t2col3,tbl2.t2col3,
tbl3.t3col1,tbl3.t3col2,tbl3.t3col3,tbl3.t3col4
from tbl1
inner join tbl2 on tbl1.col1=tbl2.t2col1 and tbl1.col2=tbl2.t2col2
inner join tbl3 on tbl1.col1=tbl3.t3col1 and tbl1.col2 = tbl3.t2col2









share|improve this question


















  • 2





    Code inside a table always seems like a good idea early in your database development career. Then you realise it isn't

    – Nick.McDermaid
    Nov 21 '18 at 5:41











  • You're probably going to need to use dynamic SQL to achieve this. By the way, you could probably improve the structure of your table.

    – Tim Biegeleisen
    Nov 21 '18 at 5:41











  • @TimBiegeleisen You can suggest one, But My final aim is to achieve the result.Thanks

    – Sagar Malandkar
    Nov 21 '18 at 6:19











  • @Sagar: It looks like you are trying to build a Table -> SQL Query compiler, effectively. I think this is a bad approach. Much simpler and much more flexible is to just store the query text in a table. Please avoid creating a compiler, as it is likely to not be as expressive or as readable as a pure SQL statement.

    – John Gietzen
    Nov 21 '18 at 17:22
















0















enter image description here



I want to build a dynamic query based on structure provided in another table.



Here is an example how I want to build query based on above table-



select tbl1.col1,tbl1.col2,
tbl2.t2col1,tbl2.t2col2,tbl2.t2col3,tbl2.t2col3,
tbl3.t3col1,tbl3.t3col2,tbl3.t3col3,tbl3.t3col4
from tbl1
inner join tbl2 on tbl1.col1=tbl2.t2col1 and tbl1.col2=tbl2.t2col2
inner join tbl3 on tbl1.col1=tbl3.t3col1 and tbl1.col2 = tbl3.t2col2









share|improve this question


















  • 2





    Code inside a table always seems like a good idea early in your database development career. Then you realise it isn't

    – Nick.McDermaid
    Nov 21 '18 at 5:41











  • You're probably going to need to use dynamic SQL to achieve this. By the way, you could probably improve the structure of your table.

    – Tim Biegeleisen
    Nov 21 '18 at 5:41











  • @TimBiegeleisen You can suggest one, But My final aim is to achieve the result.Thanks

    – Sagar Malandkar
    Nov 21 '18 at 6:19











  • @Sagar: It looks like you are trying to build a Table -> SQL Query compiler, effectively. I think this is a bad approach. Much simpler and much more flexible is to just store the query text in a table. Please avoid creating a compiler, as it is likely to not be as expressive or as readable as a pure SQL statement.

    – John Gietzen
    Nov 21 '18 at 17:22














0












0








0








enter image description here



I want to build a dynamic query based on structure provided in another table.



Here is an example how I want to build query based on above table-



select tbl1.col1,tbl1.col2,
tbl2.t2col1,tbl2.t2col2,tbl2.t2col3,tbl2.t2col3,
tbl3.t3col1,tbl3.t3col2,tbl3.t3col3,tbl3.t3col4
from tbl1
inner join tbl2 on tbl1.col1=tbl2.t2col1 and tbl1.col2=tbl2.t2col2
inner join tbl3 on tbl1.col1=tbl3.t3col1 and tbl1.col2 = tbl3.t2col2









share|improve this question














enter image description here



I want to build a dynamic query based on structure provided in another table.



Here is an example how I want to build query based on above table-



select tbl1.col1,tbl1.col2,
tbl2.t2col1,tbl2.t2col2,tbl2.t2col3,tbl2.t2col3,
tbl3.t3col1,tbl3.t3col2,tbl3.t3col3,tbl3.t3col4
from tbl1
inner join tbl2 on tbl1.col1=tbl2.t2col1 and tbl1.col2=tbl2.t2col2
inner join tbl3 on tbl1.col1=tbl3.t3col1 and tbl1.col2 = tbl3.t2col2






sql sql-server sql-server-2008 sql-server-2012 azure-sql-database






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 21 '18 at 5:38









Sagar MalandkarSagar Malandkar

186




186








  • 2





    Code inside a table always seems like a good idea early in your database development career. Then you realise it isn't

    – Nick.McDermaid
    Nov 21 '18 at 5:41











  • You're probably going to need to use dynamic SQL to achieve this. By the way, you could probably improve the structure of your table.

    – Tim Biegeleisen
    Nov 21 '18 at 5:41











  • @TimBiegeleisen You can suggest one, But My final aim is to achieve the result.Thanks

    – Sagar Malandkar
    Nov 21 '18 at 6:19











  • @Sagar: It looks like you are trying to build a Table -> SQL Query compiler, effectively. I think this is a bad approach. Much simpler and much more flexible is to just store the query text in a table. Please avoid creating a compiler, as it is likely to not be as expressive or as readable as a pure SQL statement.

    – John Gietzen
    Nov 21 '18 at 17:22














  • 2





    Code inside a table always seems like a good idea early in your database development career. Then you realise it isn't

    – Nick.McDermaid
    Nov 21 '18 at 5:41











  • You're probably going to need to use dynamic SQL to achieve this. By the way, you could probably improve the structure of your table.

    – Tim Biegeleisen
    Nov 21 '18 at 5:41











  • @TimBiegeleisen You can suggest one, But My final aim is to achieve the result.Thanks

    – Sagar Malandkar
    Nov 21 '18 at 6:19











  • @Sagar: It looks like you are trying to build a Table -> SQL Query compiler, effectively. I think this is a bad approach. Much simpler and much more flexible is to just store the query text in a table. Please avoid creating a compiler, as it is likely to not be as expressive or as readable as a pure SQL statement.

    – John Gietzen
    Nov 21 '18 at 17:22








2




2





Code inside a table always seems like a good idea early in your database development career. Then you realise it isn't

– Nick.McDermaid
Nov 21 '18 at 5:41





Code inside a table always seems like a good idea early in your database development career. Then you realise it isn't

– Nick.McDermaid
Nov 21 '18 at 5:41













You're probably going to need to use dynamic SQL to achieve this. By the way, you could probably improve the structure of your table.

– Tim Biegeleisen
Nov 21 '18 at 5:41





You're probably going to need to use dynamic SQL to achieve this. By the way, you could probably improve the structure of your table.

– Tim Biegeleisen
Nov 21 '18 at 5:41













@TimBiegeleisen You can suggest one, But My final aim is to achieve the result.Thanks

– Sagar Malandkar
Nov 21 '18 at 6:19





@TimBiegeleisen You can suggest one, But My final aim is to achieve the result.Thanks

– Sagar Malandkar
Nov 21 '18 at 6:19













@Sagar: It looks like you are trying to build a Table -> SQL Query compiler, effectively. I think this is a bad approach. Much simpler and much more flexible is to just store the query text in a table. Please avoid creating a compiler, as it is likely to not be as expressive or as readable as a pure SQL statement.

– John Gietzen
Nov 21 '18 at 17:22





@Sagar: It looks like you are trying to build a Table -> SQL Query compiler, effectively. I think this is a bad approach. Much simpler and much more flexible is to just store the query text in a table. Please avoid creating a compiler, as it is likely to not be as expressive or as readable as a pure SQL statement.

– John Gietzen
Nov 21 '18 at 17:22












2 Answers
2






active

oldest

votes


















0














Prepare Dynamic SQL statement, which should be generated from your table based on conditions.



SELECT 'SELECT * FROM '+ tablename+
' INNER JOIN '+joinTable+ ' ON '....
FROM table





share|improve this answer
























  • Is this valid SQL Server syntax, that is, can you actually run this answer?

    – Tim Biegeleisen
    Nov 21 '18 at 6:23











  • Yes, just store your dynamic query into variable and execute it using sp_executesql.

    – JERRY
    Nov 21 '18 at 7:37



















0














1) Configuration table structure



CREATE TABLE [dbo].[ConfigQuery](
[TableName] [varchar](max) NULL, -- Hold the table Name
[ColumnName] [varchar](max) NULL, -- Column Nam for the Table
[JoinColumn] [varchar](500) NULL, -- Join Column for the current table
[JoinTable] [varchar](500) NULL, -- Join table for the current table
[JoinTblColumn] [varchar](500) NULL, -- Column name of Join table with respect to current table column
[SiteName] [varchar](500) NULL, -- Site name
[RowId] [int] NULL, -- For the purpose of loop, as CURSOR not supported in SQL DATA WAREHOUSE
[ColAlias] [varchar](5000) NULL – Alias name for the column
)


2) Store Procedure to Move data from External Table to Staging Table



CREATE PROCEDURE MoveDataFromExternalToStagingTable
@StagingTable varchar(8000),-- Staging Table name
@SiteName varchar(8000) -- Site Name e.g LGW, PRW
AS
BEGIN

DECLARE @FILE_CNT INT = (SELECT count(*) from ConfigQuery where SiteName= @SiteName); -- Hold total no.of rows count
Declare @query varchar(8000) =''; -- Columns for the query
Declare @from_query varchar(8000) =''; -- From condtion for query

Declare @JoinQuery varchar(8000) =''; -- Join condition for query
Declare @whereCon varchar(8000) =''; -- Where condition for query
Declare @finalQuery varchar(8000) =''; -- Final query @query + @from_query + @JoinQuery + @whereCon
DECLARE @LOOP_CNT INT = 1;
declare @j int=0;



-- While loop replaces cursor
WHILE @LOOP_CNT <= @FILE_CNT
BEGIN
DECLARE @v_TableName NVARCHAR(4000) = (SELECT TableName FROM ConfigQuery WHERE rowId = @LOOP_CNT); -- Hold the table name for current row id
DECLARE @v_ColumnName NVARCHAR(4000) = (SELECT ColumnName FROM ConfigQuery WHERE rowId = @LOOP_CNT); -- Hold the column name for table of current row id
DECLARE @v_JoinTable NVARCHAR(4000) = (SELECT JoinTable FROM ConfigQuery WHERE rowId = @LOOP_CNT); -- Hold the join table name for table of current row id
DECLARE @v_JoinColumn NVARCHAR(4000) = (SELECT JoinColumn FROM ConfigQuery WHERE rowId = @LOOP_CNT); -- Hold the join column name for table of current row id
DECLARE @v_JoinTblColumn NVARCHAR(4000) = (SELECT JoinTblColumn FROM ConfigQuery WHERE rowId = @LOOP_CNT); -- Hold the join table column name for table of current row id
DECLARE @v_Alias NVARCHAR(4000) = (SELECT ColAlias FROM ConfigQuery WHERE rowId = @LOOP_CNT); -- Hold the alias name for column

DECLARE @first_TableName NVARCHAR(4000) = (SELECT TableName FROM ConfigQuery WHERE rowId = 1);
if @LOOP_CNT != @FILE_CNT
BEGIN
IF @v_Alias != NULL OR @v_Alias != ''
set @query += @v_TableName +'.'+@v_ColumnName +' AS '+@v_Alias +' , ';
ELSE
set @query += @v_TableName +'.'+@v_ColumnName +' , ';
END
else
BEGIN
IF @v_Alias != NULL OR @v_Alias != ''
set @query += @v_TableName +'.'+@v_ColumnName +' AS '+@v_Alias;
ELSE
set @query += @v_TableName +'.'+@v_ColumnName;
END


if @LOOP_CNT=1
BEGIN
set @from_query += 'from '+@v_TableName;

END
else
BEGIN
DECLARE @prev_TableName NVARCHAR(4000) = (SELECT TableName FROM ConfigQuery WHERE rowId = @LOOP_CNT-1);


if(@prev_TableName = @v_TableName)
BEGIN


if @v_JoinColumn != null or @v_JoinColumn != ''
BEGIN
if @j=0
begin
set @joinquery += @v_JoinTable+'.'+@v_JoinTblColumn+' = '+@v_TableName+'.'+@v_JoinColumn;
set @j=1
end
else
begin
set @joinquery += ' and ' + @v_JoinTable+'.'+@v_JoinTblColumn+' = '+@v_TableName+'.'+@v_JoinColumn;
end
END
END
ELSE
BEGIN
set @joinquery += ' inner join '+ @v_TableName + ' on ';
set @j=0
if @v_JoinTblColumn != null
set @joinquery += @v_JoinTable+'.'+@v_JoinTblColumn+' = '+@v_TableName+'.'+@v_JoinColumn;
END

END

SET @LOOP_CNT +=1;
END

Print @query
Print @from_query
Print @joinquery
set @finalQuery = 'Insert into '+ @StagingTable + ' select '+@query + @from_query + @JoinQuery

exec(@finalQuery) -- executes the final query

END
--------------

Exec MoveDataFromExternalToStagingTable @StagingTable =’ Stagingtable’),-- Staging Table name
@SiteName =’LGW’


Result statement of the SP-



Insert into Stagingtable select tbl1.col1 AS Column1 , tbl1.col2 , tbl2.t2Col1 , tbl2.t2Col2 , tbl2.t2Col3 AS Column3 , tbl2.t2Col4 , tbl3.t3Col1 , tbl3.t3Col2 , tbl3.t3Col3 , tbl3.t3Col4
from tbl1
inner join tbl2 on tbl1.col1 = tbl2.t2Col1 and tbl1.col2 = tbl2.t2Col2 inner join tbl3 on tbl2.t2Col1 = tbl3.t3Col3 and tbl1.col1 = tbl3.t3Col1 and tbl1.col2 = tbl3.t3Col2





share|improve this answer























    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53405840%2fbuilding-query-based-on-column-name-provided-in-another-table%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    2 Answers
    2






    active

    oldest

    votes








    2 Answers
    2






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    0














    Prepare Dynamic SQL statement, which should be generated from your table based on conditions.



    SELECT 'SELECT * FROM '+ tablename+
    ' INNER JOIN '+joinTable+ ' ON '....
    FROM table





    share|improve this answer
























    • Is this valid SQL Server syntax, that is, can you actually run this answer?

      – Tim Biegeleisen
      Nov 21 '18 at 6:23











    • Yes, just store your dynamic query into variable and execute it using sp_executesql.

      – JERRY
      Nov 21 '18 at 7:37
















    0














    Prepare Dynamic SQL statement, which should be generated from your table based on conditions.



    SELECT 'SELECT * FROM '+ tablename+
    ' INNER JOIN '+joinTable+ ' ON '....
    FROM table





    share|improve this answer
























    • Is this valid SQL Server syntax, that is, can you actually run this answer?

      – Tim Biegeleisen
      Nov 21 '18 at 6:23











    • Yes, just store your dynamic query into variable and execute it using sp_executesql.

      – JERRY
      Nov 21 '18 at 7:37














    0












    0








    0







    Prepare Dynamic SQL statement, which should be generated from your table based on conditions.



    SELECT 'SELECT * FROM '+ tablename+
    ' INNER JOIN '+joinTable+ ' ON '....
    FROM table





    share|improve this answer













    Prepare Dynamic SQL statement, which should be generated from your table based on conditions.



    SELECT 'SELECT * FROM '+ tablename+
    ' INNER JOIN '+joinTable+ ' ON '....
    FROM table






    share|improve this answer












    share|improve this answer



    share|improve this answer










    answered Nov 21 '18 at 6:00









    JERRYJERRY

    875413




    875413













    • Is this valid SQL Server syntax, that is, can you actually run this answer?

      – Tim Biegeleisen
      Nov 21 '18 at 6:23











    • Yes, just store your dynamic query into variable and execute it using sp_executesql.

      – JERRY
      Nov 21 '18 at 7:37



















    • Is this valid SQL Server syntax, that is, can you actually run this answer?

      – Tim Biegeleisen
      Nov 21 '18 at 6:23











    • Yes, just store your dynamic query into variable and execute it using sp_executesql.

      – JERRY
      Nov 21 '18 at 7:37

















    Is this valid SQL Server syntax, that is, can you actually run this answer?

    – Tim Biegeleisen
    Nov 21 '18 at 6:23





    Is this valid SQL Server syntax, that is, can you actually run this answer?

    – Tim Biegeleisen
    Nov 21 '18 at 6:23













    Yes, just store your dynamic query into variable and execute it using sp_executesql.

    – JERRY
    Nov 21 '18 at 7:37





    Yes, just store your dynamic query into variable and execute it using sp_executesql.

    – JERRY
    Nov 21 '18 at 7:37













    0














    1) Configuration table structure



    CREATE TABLE [dbo].[ConfigQuery](
    [TableName] [varchar](max) NULL, -- Hold the table Name
    [ColumnName] [varchar](max) NULL, -- Column Nam for the Table
    [JoinColumn] [varchar](500) NULL, -- Join Column for the current table
    [JoinTable] [varchar](500) NULL, -- Join table for the current table
    [JoinTblColumn] [varchar](500) NULL, -- Column name of Join table with respect to current table column
    [SiteName] [varchar](500) NULL, -- Site name
    [RowId] [int] NULL, -- For the purpose of loop, as CURSOR not supported in SQL DATA WAREHOUSE
    [ColAlias] [varchar](5000) NULL – Alias name for the column
    )


    2) Store Procedure to Move data from External Table to Staging Table



    CREATE PROCEDURE MoveDataFromExternalToStagingTable
    @StagingTable varchar(8000),-- Staging Table name
    @SiteName varchar(8000) -- Site Name e.g LGW, PRW
    AS
    BEGIN

    DECLARE @FILE_CNT INT = (SELECT count(*) from ConfigQuery where SiteName= @SiteName); -- Hold total no.of rows count
    Declare @query varchar(8000) =''; -- Columns for the query
    Declare @from_query varchar(8000) =''; -- From condtion for query

    Declare @JoinQuery varchar(8000) =''; -- Join condition for query
    Declare @whereCon varchar(8000) =''; -- Where condition for query
    Declare @finalQuery varchar(8000) =''; -- Final query @query + @from_query + @JoinQuery + @whereCon
    DECLARE @LOOP_CNT INT = 1;
    declare @j int=0;



    -- While loop replaces cursor
    WHILE @LOOP_CNT <= @FILE_CNT
    BEGIN
    DECLARE @v_TableName NVARCHAR(4000) = (SELECT TableName FROM ConfigQuery WHERE rowId = @LOOP_CNT); -- Hold the table name for current row id
    DECLARE @v_ColumnName NVARCHAR(4000) = (SELECT ColumnName FROM ConfigQuery WHERE rowId = @LOOP_CNT); -- Hold the column name for table of current row id
    DECLARE @v_JoinTable NVARCHAR(4000) = (SELECT JoinTable FROM ConfigQuery WHERE rowId = @LOOP_CNT); -- Hold the join table name for table of current row id
    DECLARE @v_JoinColumn NVARCHAR(4000) = (SELECT JoinColumn FROM ConfigQuery WHERE rowId = @LOOP_CNT); -- Hold the join column name for table of current row id
    DECLARE @v_JoinTblColumn NVARCHAR(4000) = (SELECT JoinTblColumn FROM ConfigQuery WHERE rowId = @LOOP_CNT); -- Hold the join table column name for table of current row id
    DECLARE @v_Alias NVARCHAR(4000) = (SELECT ColAlias FROM ConfigQuery WHERE rowId = @LOOP_CNT); -- Hold the alias name for column

    DECLARE @first_TableName NVARCHAR(4000) = (SELECT TableName FROM ConfigQuery WHERE rowId = 1);
    if @LOOP_CNT != @FILE_CNT
    BEGIN
    IF @v_Alias != NULL OR @v_Alias != ''
    set @query += @v_TableName +'.'+@v_ColumnName +' AS '+@v_Alias +' , ';
    ELSE
    set @query += @v_TableName +'.'+@v_ColumnName +' , ';
    END
    else
    BEGIN
    IF @v_Alias != NULL OR @v_Alias != ''
    set @query += @v_TableName +'.'+@v_ColumnName +' AS '+@v_Alias;
    ELSE
    set @query += @v_TableName +'.'+@v_ColumnName;
    END


    if @LOOP_CNT=1
    BEGIN
    set @from_query += 'from '+@v_TableName;

    END
    else
    BEGIN
    DECLARE @prev_TableName NVARCHAR(4000) = (SELECT TableName FROM ConfigQuery WHERE rowId = @LOOP_CNT-1);


    if(@prev_TableName = @v_TableName)
    BEGIN


    if @v_JoinColumn != null or @v_JoinColumn != ''
    BEGIN
    if @j=0
    begin
    set @joinquery += @v_JoinTable+'.'+@v_JoinTblColumn+' = '+@v_TableName+'.'+@v_JoinColumn;
    set @j=1
    end
    else
    begin
    set @joinquery += ' and ' + @v_JoinTable+'.'+@v_JoinTblColumn+' = '+@v_TableName+'.'+@v_JoinColumn;
    end
    END
    END
    ELSE
    BEGIN
    set @joinquery += ' inner join '+ @v_TableName + ' on ';
    set @j=0
    if @v_JoinTblColumn != null
    set @joinquery += @v_JoinTable+'.'+@v_JoinTblColumn+' = '+@v_TableName+'.'+@v_JoinColumn;
    END

    END

    SET @LOOP_CNT +=1;
    END

    Print @query
    Print @from_query
    Print @joinquery
    set @finalQuery = 'Insert into '+ @StagingTable + ' select '+@query + @from_query + @JoinQuery

    exec(@finalQuery) -- executes the final query

    END
    --------------

    Exec MoveDataFromExternalToStagingTable @StagingTable =’ Stagingtable’),-- Staging Table name
    @SiteName =’LGW’


    Result statement of the SP-



    Insert into Stagingtable select tbl1.col1 AS Column1 , tbl1.col2 , tbl2.t2Col1 , tbl2.t2Col2 , tbl2.t2Col3 AS Column3 , tbl2.t2Col4 , tbl3.t3Col1 , tbl3.t3Col2 , tbl3.t3Col3 , tbl3.t3Col4
    from tbl1
    inner join tbl2 on tbl1.col1 = tbl2.t2Col1 and tbl1.col2 = tbl2.t2Col2 inner join tbl3 on tbl2.t2Col1 = tbl3.t3Col3 and tbl1.col1 = tbl3.t3Col1 and tbl1.col2 = tbl3.t3Col2





    share|improve this answer




























      0














      1) Configuration table structure



      CREATE TABLE [dbo].[ConfigQuery](
      [TableName] [varchar](max) NULL, -- Hold the table Name
      [ColumnName] [varchar](max) NULL, -- Column Nam for the Table
      [JoinColumn] [varchar](500) NULL, -- Join Column for the current table
      [JoinTable] [varchar](500) NULL, -- Join table for the current table
      [JoinTblColumn] [varchar](500) NULL, -- Column name of Join table with respect to current table column
      [SiteName] [varchar](500) NULL, -- Site name
      [RowId] [int] NULL, -- For the purpose of loop, as CURSOR not supported in SQL DATA WAREHOUSE
      [ColAlias] [varchar](5000) NULL – Alias name for the column
      )


      2) Store Procedure to Move data from External Table to Staging Table



      CREATE PROCEDURE MoveDataFromExternalToStagingTable
      @StagingTable varchar(8000),-- Staging Table name
      @SiteName varchar(8000) -- Site Name e.g LGW, PRW
      AS
      BEGIN

      DECLARE @FILE_CNT INT = (SELECT count(*) from ConfigQuery where SiteName= @SiteName); -- Hold total no.of rows count
      Declare @query varchar(8000) =''; -- Columns for the query
      Declare @from_query varchar(8000) =''; -- From condtion for query

      Declare @JoinQuery varchar(8000) =''; -- Join condition for query
      Declare @whereCon varchar(8000) =''; -- Where condition for query
      Declare @finalQuery varchar(8000) =''; -- Final query @query + @from_query + @JoinQuery + @whereCon
      DECLARE @LOOP_CNT INT = 1;
      declare @j int=0;



      -- While loop replaces cursor
      WHILE @LOOP_CNT <= @FILE_CNT
      BEGIN
      DECLARE @v_TableName NVARCHAR(4000) = (SELECT TableName FROM ConfigQuery WHERE rowId = @LOOP_CNT); -- Hold the table name for current row id
      DECLARE @v_ColumnName NVARCHAR(4000) = (SELECT ColumnName FROM ConfigQuery WHERE rowId = @LOOP_CNT); -- Hold the column name for table of current row id
      DECLARE @v_JoinTable NVARCHAR(4000) = (SELECT JoinTable FROM ConfigQuery WHERE rowId = @LOOP_CNT); -- Hold the join table name for table of current row id
      DECLARE @v_JoinColumn NVARCHAR(4000) = (SELECT JoinColumn FROM ConfigQuery WHERE rowId = @LOOP_CNT); -- Hold the join column name for table of current row id
      DECLARE @v_JoinTblColumn NVARCHAR(4000) = (SELECT JoinTblColumn FROM ConfigQuery WHERE rowId = @LOOP_CNT); -- Hold the join table column name for table of current row id
      DECLARE @v_Alias NVARCHAR(4000) = (SELECT ColAlias FROM ConfigQuery WHERE rowId = @LOOP_CNT); -- Hold the alias name for column

      DECLARE @first_TableName NVARCHAR(4000) = (SELECT TableName FROM ConfigQuery WHERE rowId = 1);
      if @LOOP_CNT != @FILE_CNT
      BEGIN
      IF @v_Alias != NULL OR @v_Alias != ''
      set @query += @v_TableName +'.'+@v_ColumnName +' AS '+@v_Alias +' , ';
      ELSE
      set @query += @v_TableName +'.'+@v_ColumnName +' , ';
      END
      else
      BEGIN
      IF @v_Alias != NULL OR @v_Alias != ''
      set @query += @v_TableName +'.'+@v_ColumnName +' AS '+@v_Alias;
      ELSE
      set @query += @v_TableName +'.'+@v_ColumnName;
      END


      if @LOOP_CNT=1
      BEGIN
      set @from_query += 'from '+@v_TableName;

      END
      else
      BEGIN
      DECLARE @prev_TableName NVARCHAR(4000) = (SELECT TableName FROM ConfigQuery WHERE rowId = @LOOP_CNT-1);


      if(@prev_TableName = @v_TableName)
      BEGIN


      if @v_JoinColumn != null or @v_JoinColumn != ''
      BEGIN
      if @j=0
      begin
      set @joinquery += @v_JoinTable+'.'+@v_JoinTblColumn+' = '+@v_TableName+'.'+@v_JoinColumn;
      set @j=1
      end
      else
      begin
      set @joinquery += ' and ' + @v_JoinTable+'.'+@v_JoinTblColumn+' = '+@v_TableName+'.'+@v_JoinColumn;
      end
      END
      END
      ELSE
      BEGIN
      set @joinquery += ' inner join '+ @v_TableName + ' on ';
      set @j=0
      if @v_JoinTblColumn != null
      set @joinquery += @v_JoinTable+'.'+@v_JoinTblColumn+' = '+@v_TableName+'.'+@v_JoinColumn;
      END

      END

      SET @LOOP_CNT +=1;
      END

      Print @query
      Print @from_query
      Print @joinquery
      set @finalQuery = 'Insert into '+ @StagingTable + ' select '+@query + @from_query + @JoinQuery

      exec(@finalQuery) -- executes the final query

      END
      --------------

      Exec MoveDataFromExternalToStagingTable @StagingTable =’ Stagingtable’),-- Staging Table name
      @SiteName =’LGW’


      Result statement of the SP-



      Insert into Stagingtable select tbl1.col1 AS Column1 , tbl1.col2 , tbl2.t2Col1 , tbl2.t2Col2 , tbl2.t2Col3 AS Column3 , tbl2.t2Col4 , tbl3.t3Col1 , tbl3.t3Col2 , tbl3.t3Col3 , tbl3.t3Col4
      from tbl1
      inner join tbl2 on tbl1.col1 = tbl2.t2Col1 and tbl1.col2 = tbl2.t2Col2 inner join tbl3 on tbl2.t2Col1 = tbl3.t3Col3 and tbl1.col1 = tbl3.t3Col1 and tbl1.col2 = tbl3.t3Col2





      share|improve this answer


























        0












        0








        0







        1) Configuration table structure



        CREATE TABLE [dbo].[ConfigQuery](
        [TableName] [varchar](max) NULL, -- Hold the table Name
        [ColumnName] [varchar](max) NULL, -- Column Nam for the Table
        [JoinColumn] [varchar](500) NULL, -- Join Column for the current table
        [JoinTable] [varchar](500) NULL, -- Join table for the current table
        [JoinTblColumn] [varchar](500) NULL, -- Column name of Join table with respect to current table column
        [SiteName] [varchar](500) NULL, -- Site name
        [RowId] [int] NULL, -- For the purpose of loop, as CURSOR not supported in SQL DATA WAREHOUSE
        [ColAlias] [varchar](5000) NULL – Alias name for the column
        )


        2) Store Procedure to Move data from External Table to Staging Table



        CREATE PROCEDURE MoveDataFromExternalToStagingTable
        @StagingTable varchar(8000),-- Staging Table name
        @SiteName varchar(8000) -- Site Name e.g LGW, PRW
        AS
        BEGIN

        DECLARE @FILE_CNT INT = (SELECT count(*) from ConfigQuery where SiteName= @SiteName); -- Hold total no.of rows count
        Declare @query varchar(8000) =''; -- Columns for the query
        Declare @from_query varchar(8000) =''; -- From condtion for query

        Declare @JoinQuery varchar(8000) =''; -- Join condition for query
        Declare @whereCon varchar(8000) =''; -- Where condition for query
        Declare @finalQuery varchar(8000) =''; -- Final query @query + @from_query + @JoinQuery + @whereCon
        DECLARE @LOOP_CNT INT = 1;
        declare @j int=0;



        -- While loop replaces cursor
        WHILE @LOOP_CNT <= @FILE_CNT
        BEGIN
        DECLARE @v_TableName NVARCHAR(4000) = (SELECT TableName FROM ConfigQuery WHERE rowId = @LOOP_CNT); -- Hold the table name for current row id
        DECLARE @v_ColumnName NVARCHAR(4000) = (SELECT ColumnName FROM ConfigQuery WHERE rowId = @LOOP_CNT); -- Hold the column name for table of current row id
        DECLARE @v_JoinTable NVARCHAR(4000) = (SELECT JoinTable FROM ConfigQuery WHERE rowId = @LOOP_CNT); -- Hold the join table name for table of current row id
        DECLARE @v_JoinColumn NVARCHAR(4000) = (SELECT JoinColumn FROM ConfigQuery WHERE rowId = @LOOP_CNT); -- Hold the join column name for table of current row id
        DECLARE @v_JoinTblColumn NVARCHAR(4000) = (SELECT JoinTblColumn FROM ConfigQuery WHERE rowId = @LOOP_CNT); -- Hold the join table column name for table of current row id
        DECLARE @v_Alias NVARCHAR(4000) = (SELECT ColAlias FROM ConfigQuery WHERE rowId = @LOOP_CNT); -- Hold the alias name for column

        DECLARE @first_TableName NVARCHAR(4000) = (SELECT TableName FROM ConfigQuery WHERE rowId = 1);
        if @LOOP_CNT != @FILE_CNT
        BEGIN
        IF @v_Alias != NULL OR @v_Alias != ''
        set @query += @v_TableName +'.'+@v_ColumnName +' AS '+@v_Alias +' , ';
        ELSE
        set @query += @v_TableName +'.'+@v_ColumnName +' , ';
        END
        else
        BEGIN
        IF @v_Alias != NULL OR @v_Alias != ''
        set @query += @v_TableName +'.'+@v_ColumnName +' AS '+@v_Alias;
        ELSE
        set @query += @v_TableName +'.'+@v_ColumnName;
        END


        if @LOOP_CNT=1
        BEGIN
        set @from_query += 'from '+@v_TableName;

        END
        else
        BEGIN
        DECLARE @prev_TableName NVARCHAR(4000) = (SELECT TableName FROM ConfigQuery WHERE rowId = @LOOP_CNT-1);


        if(@prev_TableName = @v_TableName)
        BEGIN


        if @v_JoinColumn != null or @v_JoinColumn != ''
        BEGIN
        if @j=0
        begin
        set @joinquery += @v_JoinTable+'.'+@v_JoinTblColumn+' = '+@v_TableName+'.'+@v_JoinColumn;
        set @j=1
        end
        else
        begin
        set @joinquery += ' and ' + @v_JoinTable+'.'+@v_JoinTblColumn+' = '+@v_TableName+'.'+@v_JoinColumn;
        end
        END
        END
        ELSE
        BEGIN
        set @joinquery += ' inner join '+ @v_TableName + ' on ';
        set @j=0
        if @v_JoinTblColumn != null
        set @joinquery += @v_JoinTable+'.'+@v_JoinTblColumn+' = '+@v_TableName+'.'+@v_JoinColumn;
        END

        END

        SET @LOOP_CNT +=1;
        END

        Print @query
        Print @from_query
        Print @joinquery
        set @finalQuery = 'Insert into '+ @StagingTable + ' select '+@query + @from_query + @JoinQuery

        exec(@finalQuery) -- executes the final query

        END
        --------------

        Exec MoveDataFromExternalToStagingTable @StagingTable =’ Stagingtable’),-- Staging Table name
        @SiteName =’LGW’


        Result statement of the SP-



        Insert into Stagingtable select tbl1.col1 AS Column1 , tbl1.col2 , tbl2.t2Col1 , tbl2.t2Col2 , tbl2.t2Col3 AS Column3 , tbl2.t2Col4 , tbl3.t3Col1 , tbl3.t3Col2 , tbl3.t3Col3 , tbl3.t3Col4
        from tbl1
        inner join tbl2 on tbl1.col1 = tbl2.t2Col1 and tbl1.col2 = tbl2.t2Col2 inner join tbl3 on tbl2.t2Col1 = tbl3.t3Col3 and tbl1.col1 = tbl3.t3Col1 and tbl1.col2 = tbl3.t3Col2





        share|improve this answer













        1) Configuration table structure



        CREATE TABLE [dbo].[ConfigQuery](
        [TableName] [varchar](max) NULL, -- Hold the table Name
        [ColumnName] [varchar](max) NULL, -- Column Nam for the Table
        [JoinColumn] [varchar](500) NULL, -- Join Column for the current table
        [JoinTable] [varchar](500) NULL, -- Join table for the current table
        [JoinTblColumn] [varchar](500) NULL, -- Column name of Join table with respect to current table column
        [SiteName] [varchar](500) NULL, -- Site name
        [RowId] [int] NULL, -- For the purpose of loop, as CURSOR not supported in SQL DATA WAREHOUSE
        [ColAlias] [varchar](5000) NULL – Alias name for the column
        )


        2) Store Procedure to Move data from External Table to Staging Table



        CREATE PROCEDURE MoveDataFromExternalToStagingTable
        @StagingTable varchar(8000),-- Staging Table name
        @SiteName varchar(8000) -- Site Name e.g LGW, PRW
        AS
        BEGIN

        DECLARE @FILE_CNT INT = (SELECT count(*) from ConfigQuery where SiteName= @SiteName); -- Hold total no.of rows count
        Declare @query varchar(8000) =''; -- Columns for the query
        Declare @from_query varchar(8000) =''; -- From condtion for query

        Declare @JoinQuery varchar(8000) =''; -- Join condition for query
        Declare @whereCon varchar(8000) =''; -- Where condition for query
        Declare @finalQuery varchar(8000) =''; -- Final query @query + @from_query + @JoinQuery + @whereCon
        DECLARE @LOOP_CNT INT = 1;
        declare @j int=0;



        -- While loop replaces cursor
        WHILE @LOOP_CNT <= @FILE_CNT
        BEGIN
        DECLARE @v_TableName NVARCHAR(4000) = (SELECT TableName FROM ConfigQuery WHERE rowId = @LOOP_CNT); -- Hold the table name for current row id
        DECLARE @v_ColumnName NVARCHAR(4000) = (SELECT ColumnName FROM ConfigQuery WHERE rowId = @LOOP_CNT); -- Hold the column name for table of current row id
        DECLARE @v_JoinTable NVARCHAR(4000) = (SELECT JoinTable FROM ConfigQuery WHERE rowId = @LOOP_CNT); -- Hold the join table name for table of current row id
        DECLARE @v_JoinColumn NVARCHAR(4000) = (SELECT JoinColumn FROM ConfigQuery WHERE rowId = @LOOP_CNT); -- Hold the join column name for table of current row id
        DECLARE @v_JoinTblColumn NVARCHAR(4000) = (SELECT JoinTblColumn FROM ConfigQuery WHERE rowId = @LOOP_CNT); -- Hold the join table column name for table of current row id
        DECLARE @v_Alias NVARCHAR(4000) = (SELECT ColAlias FROM ConfigQuery WHERE rowId = @LOOP_CNT); -- Hold the alias name for column

        DECLARE @first_TableName NVARCHAR(4000) = (SELECT TableName FROM ConfigQuery WHERE rowId = 1);
        if @LOOP_CNT != @FILE_CNT
        BEGIN
        IF @v_Alias != NULL OR @v_Alias != ''
        set @query += @v_TableName +'.'+@v_ColumnName +' AS '+@v_Alias +' , ';
        ELSE
        set @query += @v_TableName +'.'+@v_ColumnName +' , ';
        END
        else
        BEGIN
        IF @v_Alias != NULL OR @v_Alias != ''
        set @query += @v_TableName +'.'+@v_ColumnName +' AS '+@v_Alias;
        ELSE
        set @query += @v_TableName +'.'+@v_ColumnName;
        END


        if @LOOP_CNT=1
        BEGIN
        set @from_query += 'from '+@v_TableName;

        END
        else
        BEGIN
        DECLARE @prev_TableName NVARCHAR(4000) = (SELECT TableName FROM ConfigQuery WHERE rowId = @LOOP_CNT-1);


        if(@prev_TableName = @v_TableName)
        BEGIN


        if @v_JoinColumn != null or @v_JoinColumn != ''
        BEGIN
        if @j=0
        begin
        set @joinquery += @v_JoinTable+'.'+@v_JoinTblColumn+' = '+@v_TableName+'.'+@v_JoinColumn;
        set @j=1
        end
        else
        begin
        set @joinquery += ' and ' + @v_JoinTable+'.'+@v_JoinTblColumn+' = '+@v_TableName+'.'+@v_JoinColumn;
        end
        END
        END
        ELSE
        BEGIN
        set @joinquery += ' inner join '+ @v_TableName + ' on ';
        set @j=0
        if @v_JoinTblColumn != null
        set @joinquery += @v_JoinTable+'.'+@v_JoinTblColumn+' = '+@v_TableName+'.'+@v_JoinColumn;
        END

        END

        SET @LOOP_CNT +=1;
        END

        Print @query
        Print @from_query
        Print @joinquery
        set @finalQuery = 'Insert into '+ @StagingTable + ' select '+@query + @from_query + @JoinQuery

        exec(@finalQuery) -- executes the final query

        END
        --------------

        Exec MoveDataFromExternalToStagingTable @StagingTable =’ Stagingtable’),-- Staging Table name
        @SiteName =’LGW’


        Result statement of the SP-



        Insert into Stagingtable select tbl1.col1 AS Column1 , tbl1.col2 , tbl2.t2Col1 , tbl2.t2Col2 , tbl2.t2Col3 AS Column3 , tbl2.t2Col4 , tbl3.t3Col1 , tbl3.t3Col2 , tbl3.t3Col3 , tbl3.t3Col4
        from tbl1
        inner join tbl2 on tbl1.col1 = tbl2.t2Col1 and tbl1.col2 = tbl2.t2Col2 inner join tbl3 on tbl2.t2Col1 = tbl3.t3Col3 and tbl1.col1 = tbl3.t3Col1 and tbl1.col2 = tbl3.t3Col2






        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 21 '18 at 9:42









        Sagar MalandkarSagar Malandkar

        186




        186






























            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53405840%2fbuilding-query-based-on-column-name-provided-in-another-table%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Guess what letter conforming each word

            Port of Spain

            Run scheduled task as local user group (not BUILTIN)