gpt4 book ai didi

sql-server - ';'在 SQL 语句的开头

转载 作者:行者123 更新时间:2023-12-02 10:06:45 26 4
gpt4 key购买 nike

有时我会看到以分号“;”开头的 SQL Server 语句像下面这样

;WITH cte
AS (SELECT ROW_NUMBER() OVER (PARTITION BY Col1, Col2, Col3
ORDER BY ( SELECT 0)) RN
FROM #MyTable)
DELETE FROM cte
WHERE RN > 1

另一个例子是;THROW

为什么会有一个“;” TSQL 语句的开头

更新1:

请注意,我问的是“;”在陈述的开头。这个问题与这个问题不重复

When should I use semicolons in SQL Server?

更新2:

@MartinSmith 的回答很有道理。

为了确保我们对这篇文章有完整的答案,请考虑这篇受人尊敬的文章:

http://www.sommarskog.se/error_handling/Part1.html#jumpTHROW

At this point you might be saying to yourself: he must be pulling my legs, did Microsoft really call the command ;THROW? Isn't it just THROW? True, if you look it up in Books Online, there is no leading semicolon. But the semicolon must be there. Officially, it is a terminator for the previous statement, but it is optional, and far from everyone uses semicolons to terminate their T‑SQL statements.

我同意@MartinSmith 的回答,但似乎这个问题已经发展到了相当极端的程度。

通常,在存储过程中,THROW 是一个由其自己的行组成的语句。 SQL 开发人员不会像这样合并 SQL 行而错过一个分号。

对我来说,人们意外删除表的可能性比将“THROW”语句与另一行 TSQL 混合在一起的可能性更高

上面引用的案例是否是极端且罕见的情况?或者我在这里遗漏了一点?

最佳答案

它应该位于语句之后而不是之前。但在大多数情况下,在 TSQL 中,语句中的终止分号目前在实践中是可选的(尽管技术上 Not ending Transact-SQL statements with a semicolon 已弃用),并且不强制存在语句终止分号。

异常(exception)是 MERGE 语句(确实需要终止分号)以及 WITHTHROW 之前的语句

因此,这是对 StackOverflow 上答案的一种防御性做法,以防 OP(或 future 的读者)将其粘贴到某些现有批处理的中间,而该批处理在前面的语句中没有所需的分号,然后提示它没有不起作用,他们收到以下错误。

Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon.

如果前面的语句以分号结束,则附加分号不会造成任何损害。它只是被视为一个空语句。

尽管在多语句无效的上下文中使用 CTE,但这种做法本身可能会导致问题。例如在此处的 WITH 之前插入分号会破坏它。

CREATE VIEW V1
AS
WITH T(X)
AS (SELECT 1)
SELECT *
FROM T;

类似地,对于THROW,盲目插入前导分号也会导致问题。

IF @i IS NULL
;THROW 50000, '@i IS NULL', 1;

Incorrect syntax near ';'.

我已经修复了the example you give in your question并将其更改为

; 

--Ensure that any immediately preceding statement is terminated with a semicolon above
WITH cte
AS (SELECT ROW_NUMBER() OVER (PARTITION BY Col1, Col2, Col3
ORDER BY ( SELECT 0)) RN
FROM #MyTable)
DELETE FROM cte
WHERE RN > 1;

关于sql-server - ';'在 SQL 语句的开头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38816857/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com