0

とのストアドプロシージャがparameter1ありますparameter2

ストアド プロシージャ内で、一時テーブルを作成しています

CREATE TABLE [dbo].#Temp    
(
[Item_ID] [int] NOT NULL,
[Item] [nvarchar](255) NULL,    
[FIELD_1] [float] NULL, 
[FIELD_2] [float] NULL

CONSTRAINT [PK___Temp] PRIMARY KEY CLUSTERED 
(
    [Item_ID] ASC
)

次に、一時テーブルに値を挿入します。

INSERT INTO [dbo].#Temp(
     [Item_ID]  
    ,[Item]
    ,[FIELD_1]
    ,[FIELD_2]
)SELECT DISTINCT 
             1 
            ,'Item Description'
            ,(SELECT Field_Name FROM NewTable
              WHERE Item_type = 'Middle'  
              AND param1 = @Parameter1  
              AND param2 = @Parameter2
              AND STAFF_Type = 'Staff1'
              AND Entity_Type = 'Entity1'
              )

            ,(SELECT Field_Name FROM NewTable
              WHERE Sch_type = 'High'  
              AND param1 = @Parameter1  
              AND param2 = @Parameter2
              AND STAFF_Type = 'Staff1'
              AND Entity_Type = 'Entity1'
              )

INSERT INTO [dbo].#Temp(
     [Item_ID]  
    ,[Item]
    ,[FIELD_1]
    ,[FIELD_2]
)SELECT DISTINCT 
             2 
            ,'Another Item Description'
            ,(SELECT Field_Name FROM NewTable
              WHERE Item_type = 'Middle'  
              AND param1 = @Parameter1  
              AND param2 = @Parameter2
              AND STAFF_Type = 'Staff1'
              AND Entity_Type = 'Entity2'
              )

            ,(SELECT Field_Name FROM NewTable
              WHERE Sch_type = 'High'  
              AND param1 = @Parameter1  
              AND param2 = @Parameter2
              AND STAFF_Type = 'Staff1'
              AND Entity_Type = 'Entity2'
              )

などなど。次に、一時テーブルから値を選択し、一時テーブルをドロップします。

私は UDF を使用したことがなく、UDF を使用して単純にリファクタリングできるかどうか疑問に思っています。例や提案は大歓迎です。

4

2 に答える 2

0

テーブルへのトリップ数を考慮することが重要です。たとえば、既存のクエリをリファクタリングして、トリップ数を 4 から 2 に減らすことができます。

INSERT INTO [dbo].#Temp(
     [Item_ID]  
    ,[Item]
    ,[FIELD_1]
    ,[FIELD_2]
)
        SELECT DISTINCT 
            1 AS Item_ID
            ,'Item Description' AS Item
            ,CASE WHEN Item_type = 'Middle' THEN Field_Name ELSE NULL END AS Field_1
            ,CASE WHEN Sch_type = 'High' THEN Field_Name ELSE NULL END AS Field2
        FROM NewTable
        WHERE 
            param1 = @Parameter1  
            AND param2 = @Parameter2
            AND STAFF_Type = 'Staff1'
            AND Entity_Type = 'Entity1'
        UNION
        SELECT DISTINCT 
            2 AS Item_ID
            ,'Another Item Description' AS Item
            ,CASE WHEN Item_type = 'Middle' THEN Field_Name ELSE NULL END AS Field_1
            ,CASE WHEN Sch_type = 'High' THEN Field_Name ELSE NULL END AS Field2
        FROM NewTable
        WHERE 
            param1 = @Parameter1  
            AND param2 = @Parameter2
            AND STAFF_Type = 'Staff1'
            AND Entity_Type = 'Entity2'

または、同様のロジックで関数を作成できます。

CREATE FUNCTION dbo.GetStaff1FieldNames ( @param1 INT, @param2 INT, @Entity_Type VARCHAR(20))
RETURNS TABLE 
AS
RETURN

    SELECT
        CASE WHEN Item_type  = 'Middle' THEN Field_Name ELSE NULL END AS Field_1,
        CASE WHEN Sch_type = 'High' THEN Field_Name ELSE NULL END AS Field_2
    FROM NewTable
    WHERE 
        param1 = @Parameter1 AND  
        param2 = @Parameter2 AND
        Entity_Type = @Entity_Type AND
        STAFF_Type = 'Staff1'
    GO

次に、次のように呼び出します。

SELECT
    1 
    ,'Item Description'
    ,Field_1
    ,Field_2
FROM dbo.GetStaff1FieldNames (@param1, @param2, 'Entity1')
UNION
SELECT
    2 
    ,'Another Item Description'
    ,Field_1
    ,Field_2
FROM dbo.GetStaff1FieldNames (@param1, @param2, 'Entity2')

テーブルへの 1 回のトリップですべてを取得する方法はおそらくありますが、さらにリファクタリングするには、データに関するコンテキストがさらに必要になります。

于 2013-10-15T00:16:50.517 に答える
0

選択に共通テーブル (または "WITH") 式を使用しないのはなぜですか? その後、一時テーブルを完全に取り除くことができます。

WITH  Fields ( ID, Desc, MidField, HighField ) AS
      (
         SELECT DISTINCT 
                1 
              , 'Item Description'
              , (SELECT Field_Name FROM NewTable
                 WHERE Item_type = 'Middle'  
                 AND param1 = @Parameter1  
                 AND param2 = @Parameter2
                 AND STAFF_Type = 'Staff1'
                 AND Entity_Type = 'Entity1'
                )
              , (SELECT Field_Name FROM NewTable
                 WHERE Sch_type = 'High'  
                 AND param1 = @Parameter1  
                 AND param2 = @Parameter2
                 AND STAFF_Type = 'Staff1'
                 AND Entity_Type = 'Entity1'
                 )
         UNION
         SELECT DISTINCT 
                2 
              , 'Another Item Description'
              , (SELECT Field_Name FROM NewTable
                 WHERE Item_type = 'Middle'  
                 AND param1 = @Parameter1  
                 AND param2 = @Parameter2
                 AND STAFF_Type = 'Staff1'
                 AND Entity_Type = 'Entity2'
                )
              , (SELECT Field_Name FROM NewTable
                 WHERE Sch_type = 'High'  
                 AND param1 = @Parameter1  
                 AND param2 = @Parameter2
                 AND STAFF_Type = 'Staff1'
                 AND Entity_Type = 'Entity2'
                )
      )
SELECT *
FROM   Fields
WHERE  MidField = 'XYZ'

CTE は最初の select ステートメントでのみ使用できることに注意してください。CTE に対して複数の select ステートメントを実行することはできませんが、1 つの select ステートメントに対して複数の CTEを使用することはできます。

WITH TempA ( Columns ) AS ( SELECT * FROM TableA )
   , TempB ( Columns ) AS ( SELECT * FROM TableB )
   , TempC ( Columns ) AS ( SELECT * FROM TempA, TempB )
SELECT * FROM TempC WHERE Columns = 1
于 2013-10-14T20:41:44.430 に答える