动态循环多个表到内部连接子句
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)
我现在必须从 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)