基于按行变化的表加入

时间:2012-10-05 14:47:41

标签: sql tsql

假设我有一个包含三列的表ExampleX, TableName, ColumnName

TableName在数据库中存储表的名称,ColumnName存储我要加入X的列的名称。问题是需要将不同的行连接到不同的表(以明确定义的方式)。

我希望能够做到这样的事情:

Select *
from Example join TableName on X = ColumnName

这显然无法奏效。

我很新,并且做了一些谷歌搜索,似乎我可以使用游标循环遍历行并使用动态SQL,因为表和列的名称存储在数据库中,但我'我听说应该避免游标和动态SQL,所以我没有仔细研究过它的细节。我希望有一种解决这个问题的首选方法。

感谢。

1 个答案:

答案 0 :(得分:3)

动态SQL 可能比存储过程慢,但并非总是如此,并且随着SQL Server的成熟而变得更好。应尽可能使用非动态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