动态循环多个表到内部连接子句

Dynamically looping multiple tables to inner join clause

我现在必须从 20 个不同的 table 中提取大约 30 列。所有 20 个 table 都可以与 2 个键列连接。我想用动态连接语句替换静态连接语句。

我能够提取所有 20 个 table 名称并将其存储在 table 变量中。我无法将这些 table 变量值(对于 table 名称)附加到动态查询中。

    DECLARE @Table TABLE
    (
    TableName VARCHAR(50),Id int identity(1,1)
    )
    INSERT INTO @Table
    Select tablename From states 
    DECLARE @max int
    DECLARE @SQL VARCHAR(MAX) 
    DECLARE @TableName VARCHAR(50)
    DECLARE @id int = 1 
    Declare @Param1 varchar(20) ='p1', @param2 varchar(20) ='p2'
    DECLARE @qry NVARCHAR(MAX)
    Declare @strcolumns nvarchar(max) = 'select c1, c2, c3, ...c30 from primarytable inner Join'  
---------------  
select @max = MAX(Id) from @Table
WHILE (@id <= @max)
BEGIN
SELECT @TableName = TableName FROM @Table WHERE Id = @id
SET @SQL =      @TableName +''
SET @qry = @strColumns + @SQL
PRINT(@qry)
SET @id = @id +1
END  

下面是查询结果

select c1, c2, c3, ...c30 from primarytable inner Join tbl1
select c1, c2, c3, ...c30 from primarytable inner Join tbl2
select c1, c2, c3, ...c30 from primarytable inner Join tbl3
select c1, c2, c3, ...c30 from primarytable inner Join tbl4
select c1, c2, c3, ...c30 from primarytable inner Join tbl5
.... 
select c1, c2, c3, ...c30 from primarytable inner Join tbl20  

我希望结果集像

 select c1, c2, c3, ...c30 from
 primarytable P inner Join tbl1 on P.@p1 = tbl1.@p1  and p.@p2 = tbll.@p2
Inner join @tbl2 on p.@p1 = tbl2.@p1 and p.@p2 = tb12.@p2
.... Inner join @tbl20 on p.@p1 = tbl20.@p1 and p.@p2 = tb120.@p2

由于您每次都将静态开始字符串添加到变量中,因此您得到的是当前结果。添加另一个变量来存储移动目标,并将静态位移出WHILE循环。

    DECLARE @max int = 20
    DECLARE @SQL VARCHAR(MAX) 
    DECLARE @TableName VARCHAR(50)
    DECLARE @id int = 1 
    Declare @Param1 varchar(20) ='p1', @param2 varchar(20) ='p2'
    DECLARE @qry NVARCHAR(MAX)
    DECLARE @SQL2 VARCHAR(MAX) = ' '
    Declare @strcolumns nvarchar(max) = 'select c1, c2, c3, ...c30 from primarytable '  
---------------  
select @max = MAX(Id) from @Table
WHILE (@id <= @max)
BEGIN
SELECT @TableName = TableName FROM @Table WHERE Id = @id
SET @SQL =      'INNER JOIN  '+ @TableName + ' ON p.' + @Param1 + ' = ' + @TableName + '.'+ @param1 + ' AND p.' +  @Param2 + ' = ' + @TableName + '.'+ @param2 + ' '
SET @id = @id +1
SET @SQL2 = @SQL2 + @SQL
END 
SET @strcolumns = @strcolumns + @SQL2
PRINT (@strcolumns)