SQL Server调试 - 突出显示的行与正在执行的行不匹配

时间:2011-04-19 16:11:40

标签: sql-server sql-server-2008 debugging

我有一个SQL cmd脚本,如下所示:

:setvar DatabaseName testDb
:On Error Exit
--break point on next line
Declare @DBName varchar(255), @DBPath varchar(255), @LogName varchar(255), @LogPath varchar(255) 
IF EXISTS (SELECT 1 FROM [master].[dbo].[sysdatabases] WHERE [name] = N'$(DatabaseName)')
BEGIN
USE [$(DatabaseName)];
select @DBName = name, @DBPath = physical_name from sys.database_files where type_desc = 'ROWS'
select @LogName = name , @LogPath = physical_name from sys.database_files where type_desc = 'LOG'
END

Print @dbname
Print @dbpath

当我尝试在SQL Server Management Studio中调试上述脚本时,突出显示为当前正在执行的行的行似乎不是正在执行的行。并且基于查看本地窗口以及@dbName设置时,调试器似乎关闭了4行(当突出显示的行是声明行时,@dbname被设置为来自数据库)。

想知道是否因为调试器正在跳过我的setvar语句。还有任何解决方法。当前行不是当前行时调试大脚本非常困难!!!

2 个答案:

答案 0 :(得分:1)

这可能是LINENO派上用场的地方。当我使用LINENO然后双击错误消息时,SSMS会将我带到正确的位置。

:setvar DatabaseName testDb
:On Error Exit
LINENO 3
--break point on next line
Declare @DBName varchar(255), @DBPath varchar(255), @LogName varchar(255), @LogPath varchar(255) 
IF EXISTS (SELECT 1 FROM [master].[dbo].[sysdatabases] WHERE [name] = N'$(DatabaseName)')
BEGIN
    USE [$(DatabaseName)];
    select @DBName = name, @DBPath = physical_name from sys.database_files where type_desc = 'ROWS'
    select @LogName = name , @LogPath = physical_name from sys.database_files where type_desc = 'LOG'
END

Print @dbname
Print @dbpath

答案 1 :(得分:0)

我发现问题与语句的长度有关。您会发现如果使用空格而不是制表符来隔开空格,则会增加遇到此问题的可能性。

尝试将5个空格全部替换为制表符。这将大大减少语句的大小。 (顺便说一句,我将整个过程复制到Word,然后使用replace命令将''替换为^ t,从而用制表符替换了5个空格。

然后我将其复制回去。请注意,可能不仅仅是引起问题的空格。它可以是任何过长的语句(例如长选择语句或表创建)。希望这会有所帮助