1

有谁知道是否有可能使用Visual Studio/SQL Server Management Studio调试器来检查传递给存储过程的表值参数的内容?是否可以通过调试器检查表值参数的内容?

举一个简单的例子:

CREATE TYPE [dbo].[ControllerId] AS TABLE(
    [id] [nvarchar](max) NOT NULL 
) 
GO 

CREATE PROCEDURE [dbo].[test] 
    @controllerData [dbo].[ControllerId] READONLY 
AS 
BEGIN 
    SELECT COUNT(*) FROM @controllerData; 
END 

DECLARE @SampleData as [dbo].[ControllerId]; 
INSERT INTO @SampleData ([id]) VALUES ('test'), ('test2'); 

exec [dbo].[test] @SampleData; 

使用上面的exec语句一个破发点,我能够步入存储过程没有任何麻烦。调试器显示@controllerData local的值为'(table)',但我还没有找到任何工具可以让我实际查看组成该表的行。

回答

1

既然你没有从调试器的喜悦,这是我的建议。您可以添加一个可变输入来确定它是否处于测试模式。然后,如果它处于测试模式,请运行sp顶部的select以查看数据是什么。

CREATE TYPE [dbo].[ControllerId] AS TABLE( 
    [id] [nvarchar](max) NOT NULL 
) 
GO 

CREATE PROCEDURE [dbo].[jjtest] 
    (@controllerData [dbo].[ControllerId] READONLY 
    , @test bit = null) 
AS 
IF @test = 1 
BEGIN 
SELECT * FROM @controllerData 
END 
BEGIN 
    SELECT COUNT(*) FROM @controllerData; 
END 
GO 

DECLARE @SampleData as [dbo].[ControllerId]; 
INSERT INTO @SampleData ([id]) VALUES ('test'), ('test2'); 

EXEC [dbo].[jjtest] @SampleData, 1; 
+0

似乎在SQL Server Management Studio中运行良好 - 肯定比根本不知道表值参数中有什么更好。 尽管如此,如果您通过C#脚本调试存储过程,这并不是很好。你的代码将不得不从实际输出分离调试输出。如果发生异常,它也将在C#中崩溃 - 就我所见,无法通过C#获取任何结果的异常。 – 2010-06-10 08:16:29

1

我没有成功,试图做同样的描述。所以我猜这是不可能的。将等待SSMS 2010

1

这是不可能的表变量,但我建立a procedure这将显示一个临时表从另一个数据库连接的内容。 (这对普通查询是不可能的)。 请注意,它使用DBCC PAGE &默认跟踪来访问数据,所以只用于调试目的。

你可以把你的代码中设置断点,打开第二个连接,并要求使用它:

exec sp_select 'tempdb..#mytable'

0

有一个解决方案,我想你可以创建另一个存储过程,并填补了表值参数并调用你的主程序,然后你开始从你所做的测试过程中进行调试。

相关问题