创建动态SQL查询以联接多个表?

创建动态SQL查询以联接多个表?,sql,sql-server,Sql,Sql Server,我有一个SQl数据集,其中包含大量2000多个表。 在这些表中,我有一个名为 “main_table”包含一些参数,其中一个参数是名为“id”的键。我还有一个 名为“Tables_name”的表,它由500个表的名称组成,这些表的名称是我要连接到main的 表主表。每个表有两个参数id和value 基本上,我想左键联接数据集中的所有表,它们的名称在“tables\u name”中, 基于他们的“id”。我需要一个自动连接这些表的查询 并创建一个新表,其中包含来自主_表的所有参数以及这些关节表的值

我有一个SQl数据集,其中包含大量2000多个表。 在这些表中,我有一个名为 “main_table”包含一些参数,其中一个参数是名为“id”的键。我还有一个 名为“Tables_name”的表,它由500个表的名称组成,这些表的名称是我要连接到main的 表主表。每个表有两个参数id和value

基本上,我想左键联接数据集中的所有表,它们的名称在“tables\u name”中, 基于他们的“id”。我需要一个自动连接这些表的查询 并创建一个新表,其中包含来自主_表的所有参数以及这些关节表的值 基于其密钥,即“id”。它们都以“id”作为关键参数

   main_table:
     id, name, date, category, age, brand, number 

   Tables_name:
              tablxcd
              tableasd
              tablefgd
                  ..
                  ..
                  ..
   tablxcd:
           id,value
   tablasd:
           id,value
   tablegd: 
           id,value
我想要的表格应该是这样的:

   output_table:
               id, name, date, category, age, brand, number, tablxcd_value, tablasd_value, ...
它应该是左连接,因为可能有一些ID不是所有表都匹配的,所以在输出表中 不匹配的行的值应为零。我试过这个:

 SELECT mn.Id,mn.name
  ,mn.Date
  ,mn.brand
  ,mn.category
  ,xcs.value as tablxcd_value
  ,asd.value as tablasd_value
  FROM [mydatabase].[dbo].[main_table] mn LEFT JOIN [mydatabase].[dbo]. 
 [tablxcd] xcs ON mn.Id=xcd.Id
 LEFT JOIN [mydatabase].[dbo].[tablasd] asd ON asd.Id=mn.Id 
 where mn.Date > '2018-01-01' 

但这是手动的,有些人认为不可能将所有500个表的名称都放在这里。

这将从表列表中组合一个动态查询。它假定表的名称具有标识。如果没有,则创建一个具有标识的临时表并使用它。它还假定表名不包含特殊字符或使用保留字

DECLARE @qry NVARCHAR(MAX), @strJoins NVARCHAR(MAX) = '', @strColumns NVARCHAR(MAX) = ''
DECLARE @i SMALLINT = 1, @imax SMALLINT = (SELECT COUNT(*) FROM dbo.tables_name)

WHILE @i <= @imax
BEGIN

SELECT @strColumns = @strColumns + CHAR(10)  + ', ' + name + '.value as ' + name + 'value' FROM dbo.tables_name WHERE Id = @i
SELECT @strJoins = @strJoins + CHAR(10) + 'LEFT JOIN ' + name + ' ON ' + name + '.Id = main.Id' FROM dbo.tables_name WHERE Id = @i

SET @i += 1
END

SELECT @qry = 'SELECT main.* ' + @strColumns + CHAR(10) + 'FROM main ' + @strJoins

PRINT @qry

老实说,这听起来像是你有一个主要的设计缺陷。到目前为止你尝试了什么,问题是什么?如果不是那么晚,你应该考虑重新设计你的数据库,因为2000个连接的表听起来像设计缺陷。不,实际上它不是设计缺陷。数据库已经存在了,我需要从中提取一些带有参数的表。我已经更新了上述问题,并提到了我迄今为止所做的努力。@TomKlarin,仅仅因为数据库已经存在,并不意味着设计没有缺陷。查询中的500个表是一个危险信号,因为需要使用动态SQL。FWIW,在您的问题中创建了表sans data和query,实际执行计划显示超过14秒,只是为了编译查询:。我很高兴我不是支持此应用程序的DBA。不要太担心数据库设计。是的,很糟糕。但你必须接受你所拥有的,并修复他们让你修复的。我在“Tables\u name”表中添加了一列“ID”作为标识。在这里,我应该放什么而不是+name+?我应该使用主表中列的名称吗?我还关心SQL命令的最大大小~65k?RE:我在“Tables_name”表中添加了一个列“ID”作为标识。在这里,我应该放什么而不是+name+?我应该使用主表中列的名称吗?脚本将使用IDENTITY按原样运行。RE:我还担心SQL命令的最大大小~65k?可能发生。但是65k是很多连接。65k是很多连接-事实上。。。2000+是很多表,但这是c。每个join语句30个字符-我认为这还不够?