我正在调查an odd error from a SQL Server 2005 stored procedure我无法通过直接从Management Studio调用它来重现。
因此我希望能够:
这是可能的,如果是这样的话?
答案 0 :(得分:3)
您可以尝试使用visual studio中的“server explorer”,但需要配置sqlserver以允许调试。以下是一些信息:http://www.4guysfromrolla.com/articles/051607-1.aspx。但我认为你首先应该尝试像Eppz这样的Profiler。 :)
答案 1 :(得分:1)
更新:我不确定是否有办法附加到正在运行的存储过程。您可以使用分析器获取执行语句的实时跟踪(SP:StmtStarting)。另请查看Apex SQL Debug,它似乎具有更多功能,可作为Management Studio的插件使用。
如果您有Visual Studio,则可以轻松调试:
Debugging Stored Procedures in Visual Studio 2005
更多答案: What’s your favored method for debugging MS SQL stored procedures?
答案 2 :(得分:1)
如果您无法单步执行代码,可以采用以下两种方法:
#1连接一个字符串,然后插入日志文件。
声明一个类似的变量:
DECLARE @Loginfo varchar(7500)
在您完成代码的过程中将调试信息附加到其中:
SET @LogInfo=ISNULL(@LogInfo)+'#01> @x='+COALESCE(CONVERT(varchar(10),@x),'NULL')
..
SET @LogInfo=ISNULL(@LogInfo)+'#02>'
..
SET @LogInfo=ISNULL(@LogInfo)+'#03> top loop'
在所有退出点(在任何回滚之后)添加:
INSERT INTO YourLogTable VALUES(...,@ LogInfo)
取决于交易使用情况,特别是您的错误,您可能只需插入多次而不用担心回滚,因此您需要根据自己的情况进行更改。
#2写入sq服务器上的文本文件
这可能不是一个选项,因为它使用非常不安全的xp_cmdshell存储过程。但是,如果您可以使用它,并且如果来自调用应用程序的事务导致问题,请尝试创建此存储过程:
CREATE PROC log_message
@Message varchar(255)
,@FileName varchar(100)
,@OverWrite char(1) = 'N'
AS
/*
Log messages to server side text files from stored procedures/triggers/sql scripts
Input parameters:
Message - message to put in the log file
FileName - path and name of the file to log the message into
OverWrite - 'Y'=overwrite entire file with current message
'N'=append current message onto end of file
Return code:
0 - everything was fine
1 - there was an error
NOTE: the command to log the message can not be longer than 255 characters,
as a result the message and file name should be less than 245 chars combined
Example: EXEC log_message 'Duplicates found','C:\logfile.txt', 'N'
append the "Duplicates found" message onto the server's "C:\logfile.txt" file
*/
BEGIN
SET NOCOUNT ON
DECLARE @ExecuteString VARCHAR(255) --command string can only be 255 chars long
DECLARE @ReturnValue int
--build command string
SET @ExecuteString = RTRIM('echo ' + COALESCE(LTRIM(@Message),'-')
+ CASE WHEN (@OverWrite = 'Y') THEN ' > ' ELSE ' >> ' END + RTRIM(@FileName))
--run command string
EXEC @ReturnValue=master..xp_cmdshell @ExecuteString
--IF @ReturnValue!=0
-- PRINT 'command failed, return value='+CONVERT(varchar(40),@ReturnValue)
RETURN @ReturnValue
SET NOCOUNT OFF
END
通过您的代码将对所需内容的调用写入服务器上的文件
,以此来调用此过程答案 3 :(得分:0)
使用SQL Profiler查看调用过程时传递的内容以及传入的参数。
答案 4 :(得分:0)
我会在SQL语句中使用SQL Profiler和print语句的组合。不知道有哪种方法逐行逐行,但使用profiler结合print和select语句(如果使用临时表)来查看其内容,因为proc运行将很快揭示正在发生的事情。