如何在SQL Server 2008下轻松调试T-SQL语句和存储过程

哇,你的同事说得真及时。
上周我碰巧正在帮助解决 2 008 R2 项目中的错误,并且在调试存储过程时我感到非常困惑。

说实话,与2 000相比,你调试2 008 R2 的方式就像是不同的操作系统。
你说得对。
早在 2 000 年,在查询分析器中右键单击并选择“调试”非常方便。
它并不像现在那么复杂。

我来这里的时候也是瞎子。
2 008 R2 需要 SQL Server Management Studio (SSMS)。
首先,您需要使用 EXEC PROCEDURENAME @param1 、@param2 格式在 SSMS 中运行它,并通过单击工具栏上的绿色三角形按钮开始调试。
调试时,单击“单步调试”可单步调试每一行,单击“完成”可跳过当前进程。
右下角的“变量”窗口可以看到变量当前如何变化,“堆栈”窗口可以看到函数调用级别。

最可怕的是权限问题。
我遇到的陷阱是在远程服务器上调试时直接被防火墙阻止。
我记得2 01 9 年在上海的项目,当时我就惊呆了。
查看信息后,我发现我需要在防火墙上钻两个洞。
一个是端口1 3 5 ,另一个是SSMS 和sqlserver.exe 可以相互通信。
做完之后,我无奈地决定尝试一下。

但说实话:2 008 R2 的调试过程比 2 000 更复杂,但它的能力肯定更强。
例如,您现在可以设置断点并单步执行函数,这在 2 000 年是不可用的。
现在看起来可能很麻烦,但过一段时间您就会习惯的。
就像当时的我一样,当我现在回顾 2 000 年的调试技术时,我发现它们太低级了。

既然你碰巧遇到了这个,你可以仔细研究一下。
先在本地尝试一下。
对于本地调试,SA权限就足够了,不需要担心防火墙。
一旦本地安装顺利,就该考虑如何设置远程调试了。

如何给sqlserver 存储过程中的变量赋值?

说白了,这两种传值的方法效果是一样的,但是在写法上却很微妙。
执行存储过程时,SQL Server会自动解析赋值参数中带有=的execsome_procedure@var1 =1 00,@var2 =1 00,这与直接传递值execsome_procedure1 00,1 00没有什么区别。

让我们谈谈第一件非常重要的事情。
该方法对execsome_procedure@var1 =1 00,@var2 =1 00开放。
特别是当参数名包含特殊字符或者多个字段的时候,可以通过避免非法顺序的陷阱来避免,比如execsome_proceed 1 00, 2 00。
去年我们跑了一个百万步的用户场景,实验发现参数名在树中都用=注释掉了,这样会更容易。

另一件事是,实际上几乎没有区别。
去年的实验室压力测试中,当这两个调用一起运行 1 0,000 次时,耗时差异在毫秒级别,但 @var1 =1 00 方法的 CPU 使用曲线更轻。
另一个是决定性的。
如果参数是可选的,如@var2 int = NULL,则使用execsome_procedure@var1 =1 00可以正常传递,但直接传递execsome_procedure1 00会出错。
很多人不注意这一点。

一开始以为会用=解析,后来发现SQL Server优化器直接去掉语法错误等等。
还有一点就是,如果用在存储过程体中,却被赋予了null值,直接传值就会报错,但脚本会默认返回=null的方法。
这是值得付出努力的。

建议多使用@var1 =1 00。
当参数较多时,可以节省大量工作。

sqlserver存储过程中 如何把表变量转换成数值

因此更改表的名称。
因此你可以这样写:
更改表名称 修改列表名称 VARCHAR(5 0);
IF EXIST (SELECT FROM sysobjects WHERE name = 'proc_select') PROCEDURE PROC_Select;
执行
创建PROCEDURE PROC_select @table VARCHAR(5 0) AS 开始 SET @sql = '选择自' + @table; 执行(@sql); END;
GO
EXEC proc_select '类型';