簡體   English   中英

添加“ SET SHOWPLAN_ALL” SQL Server MS17后,臨時表拋出無效的對象名稱

[英]Temp table throws invalid object name after adding 'SET SHOWPLAN_ALL' Sql Server MS17

我對SQL Server還是很陌生,因此我被分配了優化CMS生成的一些SQL查詢的任務。 添加代碼后

SET SHOWPLAN_ALL ON
GO;

並執行查詢,本地臨時表#tempSecondLevel在我的INSERT INTO語句中引發“無效的對象名稱”異常。 您將看到SELECT INTO #tmpSecondLevel語句,然后看到INSERT INTO #tmpSecondLevel語句。 下一條語句是針對#tmpFirstLevel的,我不確定這些語句是否與此問題有關。

use Kentico8_2;
go
set showplan_all on;
go

-- Write revised query here.
DECLARE @ProductNodeGuid uniqueidentifier = '6F6F733D-AE4F-47DC-9BE9-52B967E9F41D'

IF OBJECT_ID('tempdb..#tmpSecondLevel') IS NOT NULL
DROP TABLE #tmpSecondLevel

IF OBJECT_ID('tempdb..#tmpFirstLevel') IS NOT NULL
DROP TABLE #tmpFirstLevel

-- Get all of the items(that go on the secondLevel) that go underneath a heading(on the firstLevel)
-- Get all of the materials that belong to this node that go on the second level
SELECT
     NodeLevel = 1
    ,NodeParentID = CASE WHEN MaterialTypeSelectByMaterial = 0 THEN M.NodeID ELSE M.NodeParentID END
    ,M.NodeID
    ,M.MaterialName
    ,MaterialImage = MV.MaterialVariantImage
    ,M.NodeAliasPath
    ,M.Published
    ,M.NodeGUID
    ,M.ClassName
    ,M.NodeOrder
INTO 
    #tmpSecondLevel
FROM 
    View_NOF_Material_Joined M
    JOIN View_NOF_Product_Joined P
        ON P.ProductMaterialNodeGuidList LIKE '%' + CONVERT(nvarchar(36), M.NodeGUID) + '%'
    JOIN View_NOF_MaterialType_Joined MT
        ON MT.NodeID = M.NodeParentID
    LEFT JOIN View_NOF_MaterialVariant_Joined MV
        ON MV.NodeParentID = M.NodeID AND MV.NodeOrder = 1 -- always the first
WHERE
    P.NodeGUID = @ProductNodeGuid AND MaterialTypeSelectByMaterial = 1

-- Get all of the material variants that belong to this node that go on the second level
INSERT INTO
    #tmpSecondLevel
SELECT
     NodeLevel = 1
    ,NodeParentID = CASE WHEN MaterialTypeSelectByMaterial = 0 THEN M.NodeID ELSE M.NodeParentID END
    ,MV.NodeID
    ,MaterialName = MV.MaterialVariantName
    ,MaterialImage = MV.MaterialVariantImage
    ,MV.NodeAliasPath
    ,MV.Published
    ,MV.NodeGUID
    ,MV.ClassName
    ,MV.NodeOrder
FROM 
    View_NOF_MaterialVariant_Joined MV
    JOIN View_NOF_Product_Joined P 
        ON P.ProductMaterialNodeGuidList LIKE '%' + CONVERT(nvarchar(36), MV.NodeGUID) + '%'
    JOIN View_NOF_Material_Joined M 
        ON M.NodeID = MV.NodeParentID
    JOIN View_NOF_MaterialType_Joined MT 
        ON MT.NodeID = M.NodeParentID
WHERE 
    P.NodeGUID = @ProductNodeGuid 
        AND MaterialTypeSelectByMaterial = 0

-- Get all of the headings( for the firstLevel) that go above a list of items(on the secondLevel)
-- Get all of the material types that are used as headings
SELECT DISTINCT
     NodeLevel = 0
    ,NodeParentID = NULL
    ,MT.NodeID
    ,MaterialName = MT.MaterialTypeName
    ,MaterialImage = ''
    ,MT.NodeAliasPath
    ,MT.Published
    ,MT.NodeGUID
    ,MT.ClassName
    ,MT.NodeOrder
INTO 
    #tmpFirstLevel
FROM 
    View_NOF_MaterialType_Joined MT
    INNER JOIN #tmpSecondLevel M 
        ON MT.NodeID = M.NodeParentID

-- Get all of the materials that are used as headings
INSERT INTO 
    #tmpFirstLevel
SELECT DISTINCT
     NodeLevel = 0
    ,NodeParentID = NULL
    ,MJ.NodeID
    ,MaterialName = MJ.MaterialName
    ,MaterialImage = ''
    ,MJ.NodeAliasPath
    ,MJ.Published
    ,MJ.NodeGUID
    ,MJ.ClassName
    ,MTJ.NodeOrder
FROM 
    View_NOF_Material_Joined MJ
    INNER JOIN View_NOF_MaterialType_Joined MTJ 
        ON MTJ.NodeID = MJ.NodeParentID
    INNER JOIN #tmpSecondLevel M 
        ON MJ.NodeID = M.NodeParentID

-- Put all of the second level items (the details) and first level items (the headings) in the same table
SELECT * FROM #tmpSecondLevel
UNION
SELECT * FROM #tmpFirstLevel
ORDER BY NodeOrder

IF OBJECT_ID('tempdb..#tmpSecondLevel') IS NOT NULL
DROP TABLE #tmpSecondLevel

IF OBJECT_ID('tempdb..#tmpFirstLevel') IS NOT NULL
DROP TABLE #tmpFirstLevel

我預言這是一個簡單的問題,因為我只添加了兩行代碼,但是對它的幫助深表感謝。 如果您對優化查詢有任何建議,也非常感謝。

提前致謝。

由於SET SHOWPLAN_ALL是顯示估計的執行計划的命令,因此出現錯誤。 因此,實際上沒有執行任何TSQL命令,因此永遠不會創建#tmpSecondLevel表。 所以你得到一個錯誤。 這與單擊SSMS中的“顯示估算的執行計划”是一樣的。

您可以在此處閱讀有關該命令的信息: https : //docs.microsoft.com/zh-cn/sql/t-sql/statements/set-showplan-all-transact-sql

如果要顯示實際執行,請用SET STATISTICS XML ON替換SHOWPLAN_ALL行。 當您運行查詢時,這將顯示實際的執行計划。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM