2014-05-19 23 views
0
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查询,如果我删除GOTO语句无法正常运行在T-SQL

USE [master] 
GO 
CREATE DATABASE [model]  
GO 

然后正常工作,否则不行。 查询有

USE [master] 
GO 
CREATE DATABASE [model]  
GO 

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

+4

'GO'终止批次。跨越批次不能识别“goto”标签。 –

+0

但是,为什么光标一直到CREATESCEDB部分?它应该去UPDATESCEDB。不是吗? – Ramakant

+0

你可以建议任何其他方式来实现sql中的相同功能?我不想有两个单独的文件来创建和更新我的数据库。 – Ramakant

回答

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 A GOTO statement references the label 'UPDATESCEDB' but the label has not been declared.

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