Sql server 如何根据表在列中出现的次数动态进行内部联接?

Sql server 如何根据表在列中出现的次数动态进行内部联接?,sql-server,tsql,dynamic,Sql Server,Tsql,Dynamic,因此,基本上我想填充表1中提到的表中名为Mjolnir\u Source\u ID的列 表1=#垂直表列表 VerticalTableName VerticalColumnName Enrollment NULL GradeMaster NULL 表2=Reference.dbo.PrepopulateExceptions TableName ColumnName

因此,基本上我想填充表1中提到的表中名为Mjolnir\u Source\u ID的列

表1=#垂直表列表

VerticalTableName           VerticalColumnName
Enrollment                     NULL
GradeMaster                    NULL
表2=Reference.dbo.PrepopulateExceptions

TableName         ColumnName         ReferenceTableName      ReferenceColumnName
GradeMaster        Grade               NULL                       NULL
GradeMaster        CatalogID           ACGradeCatalog             ID
Enrollment         Name                NULL                       NULL
Enrollment         EnrollmentID        ACEnrollmentMode           ID
Enrollment         AcademicLevelID     AcademicLevel              ID
Enrollment         CatalogID           ACGradeCatalog             ID  
表2的ReferenceTableName列中提到的所有ReferenceTables都有Mjolnir_SourceID列,我想为每个VerticalTableName表连接所有引用表的Mjolnir列

我们可以通过基于ColumnName和ReferenceColumnName列将每个VerticalTable与其ReferenceTable进行内部联接来获取每个引用表的Mjolnir_SourceID

现在,如果任何VerticalTable的ReferenceTableName和ReferenceColumnName列为空,那么我们将为concat提供ColumnName作为输入

SELECT @sqlStr = 'UPDATE a' + char(13) + char(10) + ' SET a.Mjolnir_Source_ID = CASE WHEN ' +
          ' b.ReferenceTableName IS NULL AND b.ReferenceColumnName IS NULL THEN CONCAT('+ 
           VerticalTableName +'.' + 'b.ColumnName,c.Mjolnir_Source_ID)
          ELSE CONCAT(b.Mjolnir_Source_ID, c.Mjolnir_Source_ID) '
          + char(13) + char(10) + '  FROM ' + VerticalTableName + ' a' + char(13) + char(10) 
          + ' INNER JOIN ' + 'Reference.dbo.PrepopulateExceptions b'
          + '   ON b.VerticalTable = ' + VerticalTableName +
          + ' INNER JOIN b.ReferenceTableName c ON c.ReferenceColumnName = b.ColumnName '
          FROM #VerticalTableList
从上面的查询中得到的表GradeMaster的查询结果应该如下所示

UPDATE a
SET a.Mjolnir_Source_ID = CONCAT(a.Grade,c.Mjolnir_Source_ID)
FROM GradeMaster a
INNER JOIN Reference.dbo.PrepopulateExceptions b   
ON b.VerticalTable = GradeMaster 
INNER JOIN b.ACGradeCatalog c ON 
c.ID = b.CatalogID
对于表登记,结果查询应为:

UPDATE a
SET a.Mjolnir_Source_ID = CONCAT(a.Name,c.Mjolnir_Source_ID,d.Mjolnir_Source_ID,e.Mjolnir_Source_ID)
FROM Enrollment a
INNER JOIN Reference.dbo.PrepopulateExceptions b   
ON b.VerticalTable = Enrollment 

INNER JOIN b.ACEnrollmentMode c ON 
c.ID = b.EnrollmentID

INNER JOIN b.AcademicLevel d ON 
d.ID = b.AcademicLevelID

INNER JOIN b.ACGradeCatalog e ON
e.ID = b.CatalogID

有谁能帮我一下吗?

老实说,这有一股强烈的气味。你到底想在这里取得什么成就?@Larnu是的,看起来可能是这样,但我在这里被绊倒了。我想不出怎么做。就像一个特定的垂直表有三个参考表一样。那么如何确保该表有三个连接呢?这并不能告诉我您的真正目标是什么。例如,您很少需要动态SQL。最常见的是动态透视,或者在构建脚本以对每个表/数据库执行操作时。这不是一个这样的时刻,那么你最初想解决什么问题呢?我刚刚更新了这个问题。如果您需要更多详细信息,请告诉我@LarnuAgain,这只是告诉我更多关于你在这里做什么。我不是在问你上面所说的是什么,我是在问你要解决的真正问题是什么,因为这看起来很像一个XY问题。如果你不明白那是什么,看看我第一条评论中的链接。