在检查web上的一些代码和SQL Server Management Studio生成的脚本时,我注意到一些语句以分号结束。
那么什么时候用呢?
在检查web上的一些代码和SQL Server Management Studio生成的脚本时,我注意到一些语句以分号结束。
那么什么时候用呢?
当前回答
分号在复合SELECT语句中并不总是有效。
比较一个普通复合SELECT语句的两个不同版本。
的代码
DECLARE @Test varchar(35);
SELECT @Test=
(SELECT
(SELECT
(SELECT 'Semicolons do not always work fine.';);););
SELECT @Test Test;
返回
Msg 102, Level 15, State 1, Line 5
Incorrect syntax near ';'.
然而,代码
DECLARE @Test varchar(35)
SELECT @Test=
(SELECT
(SELECT
(SELECT 'Semicolons do not always work fine.')))
SELECT @Test Test
返回
Test
-----------------------------------
Semicolons do not always work fine.
(1 row(s) affected)
其他回答
摘自Ken Powers在SQLServerCentral.Com上的文章:
分号
分号字符是语句结束符。它是ANSI SQL-92标准的一部分,但从未在Transact-SQL中使用过。事实上,编写T-SQL代码好几年都不会遇到分号。
使用
有两种情况必须使用分号。第一种情况是使用公共表表达式(CTE),而CTE不是批处理中的第一个语句。第二种情况是您发出一个servicebroker语句,而servicebroker语句不是批处理中的第一个语句。
注意:这回答了书面的问题,但不是陈述的问题。把它添加到这里,因为人们会搜索它
在递归CTE语句中,分号也用在WITH之前:
;WITH Numbers AS
(
SELECT n = 1
UNION ALL
SELECT n + 1
FROM Numbers
WHERE n+1 <= 10
)
SELECT n
FROM Numbers
这个查询将生成一个名为Numbers的CTE,由整数[1..10]组成。它是通过创建一个值为1的表来完成的,然后递归直到达到10。
分号似乎不应该与游标操作一起使用:OPEN, FETCH, CLOSE和DEALLOCATE。我在这上面浪费了几个小时。我仔细查看了BOL,并注意到[;]没有显示在这些游标语句的语法中!!
所以我有:
OPEN mycursor;
这给了我错误16916。
But:
OPEN mycursor
工作。
当在包含其他语句的批处理中使用DISABLE或ENABLE TRIGGER语句时,它前面的语句必须以分号结束。否则,您将得到一个语法错误。我用这个把头发都扯掉了……后来,我偶然发现了这个MS Connect项目。它关闭了,无法修复。
在这里看到的
在SQL2008 BOL中,他们说在下一个版本中将需要分号。因此,要经常使用它。
参考:
Transact-SQL语法约定 SQL Server 2008 R2中已弃用的数据库引擎特性(“SQL Server未来版本不支持的特性”部分,“Transact-SQL”区域)