[英]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.