Sql server 在SQL if语句的一个块中是否可以只包含一条注释?

Sql server 在SQL if语句的一个块中是否可以只包含一条注释?,sql-server,tsql,Sql Server,Tsql,我只想在if语句块中添加一条注释,但在尝试时出现了一个错误。我想更像史蒂夫·麦康奈尔 declare @ConstraintName varchar(255) set @ConstraintName = 'PK_Whatever' IF LEFT(@ConstraintName, 2) = 'PK' BEGIN --can't drop primary keys END 我得到的错误是: Incorrect syntax near 'END'. 如果我在注释后添加了一些内容,例如,

我只想在if语句块中添加一条注释,但在尝试时出现了一个错误。我想更像史蒂夫·麦康奈尔

declare @ConstraintName varchar(255)
set @ConstraintName = 'PK_Whatever'

IF LEFT(@ConstraintName, 2) = 'PK'
BEGIN
    --can't drop primary keys
END
我得到的错误是:

Incorrect syntax near 'END'.

如果我在注释后添加了一些内容,例如,
PRINT@ConstraintName
,它可以正常工作。

在SQL Server中我不能肯定,但在Oracle PL/SQL中,您会在一个块中放入一条空语句,您不想执行任何操作:

BEGIN
  -- This is a comment
  NULL;
END

否,不能有空的if块(或只包含注释的块)


你不会说你为什么想要这个。如果您只是试图注释掉If的内容以进行调试,那么您应该注释整个If。

不,我认为您不能。如果你想暂时把它注释掉,你可能需要放一个/*…*/围绕整个声明。

这不是评论。这是因为你有一个空的if块。你必须至少有一个陈述。放入print语句可能是最好的选择。

由于不能有“空”块(感谢Charles Graham),我将在if语句上方放置一条注释,以说明条件语句的意图(感谢BlackWasp),然后在begin..end块中添加一条注释,用于描述虚拟声明(感谢GiLM)

你认为我应该这样评论代码吗

declare @ConstraintName varchar(255)
set @ConstraintName = 'PK_Whatever'

--can't drop primary keys
IF LEFT(@ConstraintName, 2) = 'PK'
BEGIN
    --do nothing here
    DECLARE @Dummy bit --required to compile
END

围绕您希望删除约束的项设计SQL语句不是更好吗?因此,如果您希望删除此功能,那么

If left(@constraintname,2 <> 'PK'
BEGIN
     -- Drop your constraint here
     ALTER TABLE dbo.mytable DROP constraint ... -- etc
END
如果左侧(@constraintname,2'PK'
开始
--在这里放下你的束缚
ALTER TABLE dbo.mytable DROP约束…--等
结束

选择NULL
将生成一个结果集,可能会影响客户端应用程序。最好做一些没有效果的事情,例如:

IF LEFT(@ConstraintName, 2) = 'PK'
BEGIN
  DECLARE @Dummy bit -- Do nothing here, but this is required to compile
END

我知道它不能回答您最初的问题,即您是否可以在块中只放置一条注释,但为什么不反转您的条件,使块仅在“PK”时执行

--仅当不是主要时才删除
如果左(@ConstraintName,2)'PK'
开始
--在这里做点什么
结束
这里有一些好的提示:


因此,您只是定义了一个标签。

更新了标题。我希望在子句中有一个注释。是的,我的意思是,您可以放置注释,并包含NULL语句(如果SQL Server中存在)以避免编译错误。我将编辑我的示例以使这一想法更清晰,不幸的是,它在t-SQL中不起作用(至少在SQL2005兼容性中是这样的)。你更像史蒂夫·麦康奈尔是什么意思?我想他只是想说明为什么在这种情况下什么都不做
-- drop only if not primary
IF LEFT (@ConstraintName, 2) <> 'PK'
BEGIN
    --do something here
END
BEGIN
  DONOTHING:
END