有人能告诉我在SQL Server中何时何地需要使用begin和end阻止?
此外,该Go关键字到底是做什么的?
运行SQL 2005 X64.
首先,在数据库上创建以下存储过程:
CREATE PROCEDURE dbo.Test
@Value int = null
AS
BEGIN
IF (IsNull(@Value, '') = '')
SELECT '*I am NULL!*'
ELSE
SELECT 'I am ' + CONVERT(varchar(20), @Value)
END
Run Code Online (Sandbox Code Playgroud)
尝试按如下方式执行上述过程,您将得到以下结果:
EXEC dbo.Test
Run Code Online (Sandbox Code Playgroud)
我是NULL!
现在,改变proc以使EXEC语句成为sproc本身的一部分:
ALTER PROCEDURE dbo.Test
@Value int = null
AS
BEGIN
IF (IsNull(@Value, '') = '')
SELECT 'I am NULL!'
ELSE
SELECT 'I am ' + CONVERT(varchar(20), @Value)
END
EXEC dbo.Test
Run Code Online (Sandbox Code Playgroud)
如果你现在执行它,你得到......
我是NULL!
我是NULL!
我是NULL!
... 无限广告直到输出因此错误而中断:
消息217,级别16,状态1,过程测试,第16行超出最大存储过程,函数,触发器或视图嵌套级别(限制32).
暂时忽略这根本不是一个标准做法而且很可能有人会偶然做出类似的事情,有人可能会提供一些关于SQL 2005在思考第二个版本时"思考"的低层洞察力.这个程序执行了吗?