1

特定のレコードに含まれる情報と他のテーブルからの情報に基づいて、特定のレコードの特別な値を計算するストアド プロシージャがあります。各レコードの通常の情報を含む結果テーブルを返すクエリを作成し、各レコードの計算値を新しい列に追加したいと考えています。たとえば、次のようなものが必要です。

SELECT
   [id]     as Name,
   [shape]  as Shape,
   [color]  as Color,
   EXEC FindCode
       @id = [id]
       @shape = [shape]
       @color = [color] 
   as Code
FROM Shapes

上記の「疑似」コードに相当するものを使用すると、次のような結果セットが返されると予想されます。

Name |  Shape  | Color | Code
-----+---------+-------+-----
AB   |  Circle | Blue  | 4276
BC   |  Square | Red   | 9825
CD   |  Rect   | Gray  | 3723

名前、形状、および色は、ID、形状、および色としてテーブルに既に含まれていましたが、「コード」はストアド プロシージャを使用して計算されました。SQL Server 2008 R2 でこれを行う最善の方法は何ですか?

4

3 に答える 3

1

コードを計算するためのアルゴリズムが、同じ行の他の列のみに完全に基づいている (依存している) 場合、最適なオプションは、計算された列をテーブルに追加することです。

Alter Table MyTable Add Column
   Code as [Enter expression here that calculates the code]

例えば、

  Alter Table MyTable Add Column
   Code as Case id 
           When 'AB' Then Case Shape
                             When 'Circle' Then 4176
                             When 'Square' Then 4177
                             When 'Rect'   Then 4178 End
           When 'BC Then  Case Shape
                             When 'Circle' Then 9825
                             When 'Square' Then 9826
                             When 'Rect'   Then 9827 End

           End

このアルゴリズムが他の行または他のテーブルのデータに依存している場合は、ユーザー定義関数 [UDF] を使用する必要があります。可能であれば、スカラー UDF ではなく、 相関インライン テーブルを生成する UDF にします。

于 2012-09-04T23:11:38.190 に答える
1

プロシージャと同じことを行う関数を作成し、クエリで CROSS APPLY を使用する必要があります。

于 2012-09-04T23:12:12.550 に答える
1

このスレッドのいくつかの提案を使用して、クエリがどのように見えるかの例をいくつか示します。

1.CROSS APPLYスカラー値のユーザー定義関数を ing :

SELECT
     s.[id]     as Name
    ,s.[shape]  as Shape
    ,s.[color]  as Color
    ,c.[code]   as Code
FROM 
    [Shapes] s
CROSS APPLY
    fnFunctionThatCalculatesCodeAsAScalarValue(s.[id], s.[shape], s.[color]) c

2.テーブル定義を変更して計算列を持たせる:

CREATE TABLE Shapes AS
(
    [id] int NOT NULL,
    [shape] varchar(40) NOT NULL,
    [color] varchar(40) NOT NULL,
    [code] AS fnFunctionThatCalculatesCodeAsAScalarValue ([id], [shape],[color])
)

3.JOINテーブル値のユーザー定義関数を実行します。

SELECT
     s.[id]     as Name
    ,s.[shape]  as Shape
    ,s.[color]  as Color
    ,c.[code]   as Code
FROM 
    [Shapes] s
JOIN
    fnFunctionThatCalculatesCodesAsATable() c
    ON
    s.[id] = c.[id]
    AND
    s.[shape] = c.[shape]
    AND
    s.[color] = c.[color]

または4.別の表に、可能なすべてのカラー コードを事前に入力することもできます(可能な場合)。

例 1 と例 2 のようにスカラー値関数をそのまま使用すると、特に他のテーブルを使用する必要がある場合に、1 行に 1 回実行されるため、パフォーマンスが最悪になります。

PERSISTED列定義の後にキーワードを追加することで、計算列の例のパフォーマンスを向上させることができます。これはおそらくがそれを行う方法です。永続化された値は、挿入時に一度計算され、行が更新されると自動更新されますが、select ステートメントの永続化された場所からプルされます。

于 2012-09-04T23:28:11.430 に答える