3

VARCHAR列名のを返すスカラー関数があります。

この結果を使用して選択クエリを作成したいので、次のようにします。

SELECT dbo.udf_GetColName('Val1', ColumnFromThisTable, etc) AS myCol
FROM tbl_ThisTable WHERE ...

現時点では、これは各値の列名である UDF の実際の出力を正しくリストしています。

私が望むのは、selectステートメントが関数から返された列の値を返すことです。

SET @sql = 'SELECT ' + dbo.udf_GetColName('Val1', ColumnFromThisTable, etc) + ' AS myCol
FROM tbl_ThisTable WHERE ... '

そして走るEXEC sp_executesql

動的 SQL ルートよりも良い方法はありますか? SQL がその列を UDF からの出力としてクエリできる方法はありますか?


編集して追加

これは、ビジネスが出力を選択するルールを管理する必要がある場所であるため、更新可能なテーブルにある必要があります。それらがテーブル値関数にハードコードされている場合、それらSELECTを制御するのはもはやビジネスではありません。

はい、クエリは非常にカスタマイズ可能ですが、この場合は「良いこと」です。

さらに、 には有限数のパラメータがありますudf_GetColName。ソース列名、ソース列値を受け取り、ルール テーブルでルックアップを行います。ルールがその列とその値の一致を検出すると、output columnが選択されて返されます。それ以外の場合は、デフォルトoutput columnが使用されます。これは選択する必要がある列であるため、入力または入力値とは大きく異なる可能性があります。

言ったように、私は他のアイデアを聞いてうれしいです.もちろん、これがばかげていて、別のルートを選ぶべきなら!


家に帰る前日の最終編集

tbl_ThisTableの他の列の値に基づいて、から使用する列を選択する方法を探していますtbl_ThisTable

使用する列に関するこれらのルールは、テーブル内で簡単に更新できる必要があります。主な制限は、データベースへのインターフェース/フロント エンドです。ストレート データセットのみを返すことができるため、フロント エンドを使用してこの決定/連結を行うことはできません。複数のデータセットなど...

コードを書き直さずにデータベース内で更新できるこれらのルールを展開する良い方法があれば、ぜひ聞いてみたいです。現時点ではこれをテストしているだけなので、デザインは柔軟です。

4

2 に答える 2

1

巻き戻し、

それよりも

SET @sql = 
    'SELECT ' + dbo.udf_GetColName('Val1', ColumnFromThisTable, etc) +
        ' AS myCol FROM tbl_ThisTable WHERE ... '

なぜただしないのですか

SELECT Val1 [myCol] FROM tbl_ThisTable WHERE ...

そもそも?

呼び出し元に分岐を行わせます。


つまり、選択した ORM を使用してクライアントで SQL を生成します。

編集


Sommarskogを使用sp_executesqlして読む

より一般的には、動的な列選択ではなく結合条件で目的を達成できるように、データを正規化できると思います。実際のスキーマとサンプル データがなければ、答えを視覚化することはできません。

于 2013-04-16T16:04:48.390 に答える