2014-10-02 70 views
0

我有一个存储过程,我试图在查询窗口中调试它...当我打开存储过程,我在代码中设置了一些断点,但他们从来没有得到在下面的代码中,我可以遍历USE行,然后设置ANSI_NULLS ON,然后代码只是说成功执行了命令,即使我在它下面的所有代码中都设置了断点。我错过了什么?在MS SQL服务器2008中调试存储过程

USE [Tool1] 
GO 
/****** Object: StoredProcedure [dbo].[aspdnsf_ImportProductPricing_XML] Script Date: 10/02/2014 09:38:17 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 


Alter proc [dbo].[aspdnsf_ImportProductPricing_XML] 
    @pricing ntext 

AS 
BEGIN 
SET NOCOUNT ON 

CREATE TABLE #tmp (ProductID int, VariantID int, KitItemID int, Name nvarchar(400), KitGroup nvarchar(800), SKU nvarchar(50), SKUSuffix nvarchar(50), ManufacturerPartNumber nvarchar(50), Cost money, MSRP money, Price money, SalePrice money, Inventory int) 
DECLARE @hdoc int, @retcode int 
EXEC @retcode = sp_xml_preparedocument 
        @hdoc OUTPUT, 
        @pricing 

INSERT #tmp 
SELECT * 
FROM OPENXML(@hdoc, '/productlist/productvariant', 2) 
     WITH (ProductID int, VariantID int, KitItemID int, Name nvarchar(400), KitGroup nvarchar(800), SKU nvarchar(50), SKUSuffix nvarchar(50), ManufacturerPartNumber nvarchar(50), Cost money, MSRP money, Price money, SalePrice money, Inventory int) 


UPDATE dbo.ProductVariant 
SET Price = t.Price, 
    SalePrice = nullif(t.SalePrice,0), 
    Inventory = t.Inventory, 
    Cost = t.cost 
FROM dbo.ProductVariant p 
    join #tmp t on p.ProductID = t.ProductID and p.VariantID = t.VariantID 
WHERE KitItemID = 0 


UPDATE dbo.KitItem 
SET PriceDelta = t.Price 
FROM dbo.KitItem k 
    join #tmp t on k.KitItemID = t.KitItemID 
WHERE t.KitItemID > 0 



exec sp_xml_removedocument @hdoc 

DROP TABLE #tmp 
END 
+3

调试在SQL Server存储过程中相当没用,特别是当涉及到#temp表时。你有没有考虑过古老的'PRINT'和'SELECT'? – 2014-10-02 14:02:57

回答

1

当您调试存储过程时,您必须为该过程准备exec语句。您可以在其上设置断点,然后使用运行按钮开始调试。当你进入程序时,新的窗口将被打开。在那个窗口中设置断点。他们会工作。

+0

调试时可以在“断点”查看临时表的内容吗? – 2014-10-02 14:06:51

+0

@PhilipKelley在'DEBUG'中,你可以看到过程和局部变量的流程。要查看表格的内容,您必须使用临时的'SELECT'语句。所以从这一点我同意@AaronBertrand的评论。但是,如果您需要'DEBUG'触发器来触发另一个触发器,那么使用SSMS'DEBUG'有时会很有用。 – 2014-10-02 14:10:20

+0

这个工作完美,事后我觉得很愚蠢的尝试调试一个ALTER语句。 – user3267755 2014-10-02 14:53:01

0

几年前我放弃了对SQL的调试,很遗憾听到它甚至在最新版本中都没有改进。下面是调试存储过程时使用的tatcic的概述,它可能会帮助您,也可能不会帮助您。

首先,将代码剪切并粘贴到新的“工作”窗口。

运行任何必要的特殊格式化命令,例如,

USE [Tool1] 
GO 
/****** Object: StoredProcedure [dbo].[aspdnsf_ImportProductPricing_XML] Script Date: 10/02/2014 09:38:17 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

接下来,注释掉都记录下来通过创建(或改变)过程语句,就像这样:

--USE [Tool1] 
--GO 
--/****** Object: StoredProcedure [dbo].[aspdnsf_ImportProductPricing_XML] Script Date: 10/02/2014 09:38:17 ******/ 
--SET ANSI_NULLS ON 
--GO 
--SET QUOTED_IDENTIFIER ON 
--GO 


--Alter proc [dbo].[aspdnsf_ImportProductPricing_XML] 
-- @pricing ntext 

如果有参数,扑通一声倒在他们面前的一个DECLARE声明,并删除任何output设置。

更换AS语句与SET的值对于每个参数,并且使用这些来设置测试值

从那里,通过代码的一部分向下滚动,突出显示该点和前面的所有文本(移+控制+家)并执行(F5),并观察发生了什么。插入PRINT和SELECT语句并根据需要重复,慢慢增加每次调用执行多少代码,或者在可能的情况下只运行少数几行代码。 (这就是为什么在SQL中进行真实世界调试真的很不错,而且我没有看到发生这种情况,部分原因是由于@Temp表和部分原因是BEGIN TRANSACTION/EXECUTE/GOTO午餐/ ROLLBACK),但我离题了。其中一个问题就是你的#Temp表。在第一次传递时,它会被创建,随后的所有传递都会得到“表已存在”错误。懒惰(因为它不工作,你运行它第一次)解决方法:

DROP TABLE #tmp 
CREATE TABLE #tmp (ProductID int, <etc>) 

模糊变通:

IF object_id('tempdb..#Tmp') is not null 
    DROP TABLE #tmp 

CREATE TABLE #tmp (ProductID int) 

sp_xml_preparedocument/sp_xml_removedocument将是另一种疑难杂症。不知道该如何处理,我们在年前为Xquery提供了。

+0

[对于使用局部变量与参数非常小心](http://www.brentozar.com/archive/2014/06/tuning-stored-procedures-local-variables-problems/)。 – 2014-10-02 14:50:27

相关问题