GOTO语句在T-SQL中没有按预期工作

时间:2014-05-19 18:06:31

标签: sql-server tsql

IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = N'model')
    BEGIN
        GOTO CREATESCEDB;
    END
ELSE
    BEGIN
        GOTO UPDATESCEDB;
    END

CREATESCEDB:
PRINT 'Create'
USE [master]
GO
CREATE DATABASE [model]     
GO
GOTO ENDOFSCRIPT

UPDATESCEDB:
PRINT 'Update'
GOTO ENDOFSCRIPT

ENDOFSCRIPT:
PRINT 'END'

在上面的sql查询中,如果我删除

USE [master]
GO
CREATE DATABASE [model]     
GO

然后它可以正常工作,否则不行。

USE [master]
GO
CREATE DATABASE [model]     
GO 
查询中的

始终运行CREATE DATABASE [model]。不知道为什么。

2 个答案:

答案 0 :(得分:1)

GOTO不会批量生效。 GO关键字终止批处理。就像你有不同的脚本,即:

IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = N'model')
    BEGIN
        GOTO CREATESCEDB;
    END
ELSE
    BEGIN
        GOTO UPDATESCEDB;
    END

CREATESCEDB:
PRINT 'Create'
USE [master]

GO

CREATE DATABASE [model]     

GO

GOTO ENDOFSCRIPT

UPDATESCEDB:
PRINT 'Update'
GOTO ENDOFSCRIPT

ENDOFSCRIPT:
PRINT 'END'

所以你可以跳到CREATESCEDB而不是更进一步。你应该看到错误:

  

Msg 133,Level 15,State 1,Line 1 GOTO声明引用了   标签'UPDATESCEDB'但标签尚未声明。

答案 1 :(得分:0)

https://meta.stackexchange.com/q/185681

根据您对建议的替代请求的回应,语法可能会使用sp_executesql

    IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = N'model')
      BEGIN
        EXEC dbo.sp_executesql @statement = N'
        USE master;
        CREATE DATABASE [model];'
      END
    ELSE
      BEGIN
        PRINT 'Update'; 
      END