相关疑难解决方法(0)

我什么时候需要在SQL Server中使用Begin/End Blocks和Go关键字?

有人能告诉我在SQL Server中何时何地需要使用beginend阻止?
此外,该Go关键字到底是做什么的?

t-sql sql-server language-features

99
推荐指数
5
解决办法
11万
查看次数

是什么导致了这种奇怪的SQL行为?

运行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在思考第二个版本时"思考"的低层洞察力.这个程序执行了吗?

sql sql-server recursion stored-procedures sql-server-2005

1
推荐指数
2
解决办法
3295
查看次数