2

假设我有一个Example包含三列的表:X, TableName, ColumnName.

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

我希望能够做类似的事情:

Select *
from Example join TableName on X = ColumnName

这显然行不通。

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

谢谢。

4

1 回答 1

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
于 2012-10-05T14:57:08.870 回答