假设我有一个Example包含三列的表格:X, TableName, ColumnName。
Example
X, TableName, ColumnName
TableName将表的名称存储在数据库中,并ColumnName存储我要加入的列的名称X。问题在于,需要将不同的行(以明确定义的方式)连接到不同的表。
TableName
ColumnName
X
我希望能够执行以下操作:
Select * from Example join TableName on X = ColumnName
这显然是行不通的。
我很新,并且做了一些谷歌搜索,由于表和列的名称存储在数据库中,因此似乎可以使用游标在行上循环并使用动态SQL,但是我听说游标和动态SQL均应避免,因此我没有详细研究。我希望有一种解决此问题的首选方法。
谢谢。
动态SQL 可能 比存储的proc 慢 ,但并非总是如此,并且随着SQL Server的成熟,动态SQL变得更好。只要有可能,都应使用非动态SQL,因为它更干净且易于维护。但是,动态SQL确实占有一席之地(诸如Entity Framework和NHibernate之类的ORM工具几乎只使用动态sql)。应该尽可能避免使用游标,但是SQL确实支持WHILE循环,可以代替使用它。
DECLARE @Identity int = SELECT MIN(ex.Identity) FROM Example ex DECLARE @TableName varchar(200) DECLARE @ColumnName varchar(200) WHILE @Identity IS NOT NULL BEGIN SELECT @TableName = ex.TableName, @ColumnName = ex.ColumnName FROM Example ex WHERE ex.Identity = @Identity /* build and execute your dynamic sql here */ SET @Identity int = SELECT MIN(ex.Identity) FROM Example ex WHERE ex.Identity > @Identity END