Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MS SQL server 2008中调试存储过程_Sql_Sql Server_Debugging_Stored Procedures - Fatal编程技术网

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

在MS SQL server 2008中调试存储过程,sql,sql-server,debugging,stored-procedures,Sql,Sql Server,Debugging,Stored Procedures,我有一个存储过程,我正在尝试在查询窗口中调试它。。。当我打开存储过程时,我在代码中设置了一些断点,但它们从未被命中。。在下面的代码中,我可以单步遍历USE行,然后将ANSI_NULLS设置为ON,然后代码只显示命令已成功执行,即使我在下面的代码中都设置了断点。我错过什么了吗 USE [Tool1] GO /****** Object: StoredProcedure [dbo].[aspdnsf_ImportProductPricing_XML] Script Date: 10/02/2

我有一个存储过程,我正在尝试在查询窗口中调试它。。。当我打开存储过程时,我在代码中设置了一些断点,但它们从未被命中。。在下面的代码中,我可以单步遍历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中的调试,听到它在最新版本中也没有改进,我很难过。下面是我在调试存储过程时使用的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
接下来,通过create或alter procedure语句注释掉所有内容,如下所示:

--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语句,并删除所有输出设置

用每个参数的设置值替换AS语句,并使用这些值设置测试值

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

当然,这其中有无数的陷阱,这就是为什么在SQL中进行真实世界的调试会非常好,而我没有看到这种情况发生,部分原因是@Temp tables,部分原因是BEGIN TRANSACTION/EXECUTE/GOTO午餐/ROLLBACK,但我离题了。一个这样的问题就是你的临时表。在第一个过程中,它被创建,在所有后续过程中,您将得到一个“表已经存在”错误。懒惰是因为第一次运行它时它不工作:

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。

调试在SQL Server存储过程中非常无用,特别是当涉及临时表时。您是否考虑过老式的打印和选择?调试时是否可以在断点处查看临时表的内容?@PhilipKelley在调试中,您可以看到过程和局部变量的流程。要查看表的内容,必须使用临时SELECT语句。因此,从这一点来看,我同意@AaronBertrand的评论。但是,如果您需要调试一个触发另一个触发器的触发器,那么使用SSMS DEBUG有时是很有用的。。