繁体   English   中英

在MS SQL Server 2008中调试存储过程

[英]debugging stored procedure in MS SQL server 2008

我有一个存储过程,正在尝试在查询窗口中对其进行调试...当我打开存储过程时,我在代码中设置了一些断点,但它们从未被命中。.在下面的代码中,我可以执行以下操作通过USE行,然后将ANSI_NULLS设置为ON,然后该代码仅表示命令已成功执行,即使我在其下面的所有代码中都设置了断点。 我错过了什么吗?

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

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

我前放弃了在SQL年的调试,并感到非常难过,听到没有,即使在最近的版本中改善。 这是我在调试存储过程时使用的方法的概述,这可能会有所帮助。

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

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

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

接下来,通过create(或alter)过程语句将所有内容注释掉,如下所示:

--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值,然后使用它们来设置测试值

从那里向下滚动一部分代码,突出显示该点和所有前面的文本(Shift + Control + Home),然后执行(F5),观察会发生什么。 插入PRINT和SELECT语句并根据需要重复,缓慢增加每次调用执行的代码量,或者在可能的情况下仅运行几行选定的代码。

当然,这有不计其数的陷阱( 这就是为什么在SQL中进行真实世界的调试会非常好,而且我看不到这种情况的发生,部分是由于@Temp表,部分是由于BEGIN TRANSACTION /执行/转到午餐/回滚 ),但我离题了。 这样的陷阱之一就是您的#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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM