2016-11-22 2 views
0

一時ビューを作成し、この一時ビューに基づいて複数の更新を実行するストアドプロシージャを作成しています。 問題は、この一時ビューが最初のUPDATEコマンドの後で有効でないことです(エラーは「無効なオブジェクト名」です)。ストアドプロシージャの一時ビューは最初の更新時にのみ有効です

USE [MyDB] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[SP_MySP] 
    @passedParam VARCHAR(32) 
AS 
BEGIN 
    WITH MyTempView AS 
    (
     SELECT [myTable1].[Id] 
     FROM [dbo].[myTable1] LEFT JOIN [dbo].[myTable2] ON [myTable1].Id = [myTable2].[DeviceId] 
     WHERE 
     --all kind of conditions  
    ) 

    --The temp view is valid here 
    UPDATE [dbo].[myTable1] 
    SET [myTable1].[Ready] = 0, [myTable1].[Reason] = NULL 
    WHERE 
    [myTable1].[Id] IN (SELECT [Id] FROM MyTempView) 

    --The temp view is NO LONGER VALID from this point 
    UPDATE [dbo].[myTable1] 
    SET [myTable1].[Reason] = CONCAT([myTable1].[Reason],'Reason 1.') 
    WHERE 
    --all kind of conditions 

    UPDATE [dbo].[myTable1] 
    SET [myTable1].[Reason] = CONCAT([myTable1].[Reason],'Reason 2.') 
    WHERE 
    --all kind of conditions 

    UPDATE [dbo].[myTable1] 
    SET [myTable1].[Reason] = CONCAT([myTable1].[Reason],'Reason 3.') 
    WHERE 
    --all kind of conditions 

    UPDATE [dbo].[myTable1] 
    SET [myTable1].[Reason] = CONCAT([myTable1].[Reason],'Reason 4.') 
    WHERE 
    --all kind of conditions 

END 

どのように解決できますか? ありがとうございます。

+2

CTEは「一時ビュー」ではありません。 _ "一時テーブルを作成する" _ - あなたのspに一時テーブル作成コードはありません。 –

答えて

1

はいcteのスコープが最初の更新ステートメントに制限されているため、一時ビューは無効になります。したがって、結果を一時表に挿入します。そしてあなたが今までに望む場所でそれを使用してください。 WITH nameで作成

USE [MyDB] 
    GO 
    SET ANSI_NULLS ON 
    GO 
    SET QUOTED_IDENTIFIER ON 
    GO 
    ALTER PROCEDURE [dbo].[SP_MySP] 
     @passedParam VARCHAR(32) 
    AS 
    BEGIN 
     if object_id('tempdb..#t1') is not null 
     drop table #t1 
      SELECT [myTable1].[Id] into #t1 
      FROM [dbo].[myTable1] LEFT JOIN [dbo].[myTable2] ON [myTable1].Id = [myTable2].[DeviceId] 
      WHERE 


    --The temp view is valid here 
    UPDATE [dbo].[myTable1] 
    SET [myTable1].[Ready] = 0, [myTable1].[Reason] = NULL 
    WHERE 
    [myTable1].[Id] IN (SELECT [Id] FROM #t1) 

    --The temp view is NO LONGER VALID from this point 
    UPDATE [dbo].[myTable1] 
    SET [myTable1].[Reason] = CONCAT([myTable1].[Reason],'Reason 1.') 
    WHERE 
    --all kind of conditions 

    UPDATE [dbo].[myTable1] 
    SET [myTable1].[Reason] = CONCAT([myTable1].[Reason],'Reason 2.') 
    WHERE 
    --all kind of conditions 

    UPDATE [dbo].[myTable1] 
    SET [myTable1].[Reason] = CONCAT([myTable1].[Reason],'Reason 3.') 
    WHERE 
    --all kind of conditions 

    UPDATE [dbo].[myTable1] 
    SET [myTable1].[Reason] = CONCAT([myTable1].[Reason],'Reason 4.') 
    WHERE 
    --all kind of conditions 

    END 
0

common table expression(CTE)は、の一部である一つのコマンドに先行:

with name 
    ... implement CTE 
update ... 

これはバッチ内の任意のさらなるコマンドにはベアリングを有していないが。私はあなたが命名していると思います

はあなたを混乱さ:

  1. MyTempViewはビュー
  2. MyTempView
  3. テーブルとビューの定義(その名前の#接頭辞を持っているでしょう)、一時的ではないではありません(一時的かどうか)はwithで定義されていません。

ここでCTEで達成しようとしていることは明確ではないので、よりよいアプローチを提案するのは簡単ではありません。

関連する問題