2

Example3 つの列を持つテーブルがあるとします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 を使用する必要があります。これは、クリーンで維持しやすいためです。ただし、動的 ​​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 に答える