2

有谁知道是否可以使用 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)' 但我没有找到任何工具可以让我实际查看构成该表的行。

4

4 回答 4

2

由于您无法从调试器中获得乐趣,因此这是我的建议。您添加一个输入变量以确定它是否处于测试模式。然后如果是testmode,运行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;  
于 2010-06-09T19:23:33.680 回答
1

尝试做与您描述的相同的事情没有成功。所以我想这还不可能。将等待 SSMS 2010

于 2010-06-09T10:11:21.547 回答
1

表变量是不可能的,但我构建了一个过程,它将显示来自另一个数据库连接的临时表的内容。(这在普通查询中是不可能的)。请注意,它使用DBCC PAGE& 默认跟踪来访问数据,因此仅将其用于调试目的。

您可以通过在代码中放置断点、打开第二个连接并调用来使用它:

exec sp_select 'tempdb..#mytable'

于 2011-08-01T09:31:28.733 回答
0

有一个解决方案我认为您可以创建另一个存储过程并填充表值参数并调用您的主过程,然后从您制作的测试过程开始调试。

于 2011-10-07T07:34:14.683 回答