【问题标题】:SQL Syntax error on commented T-SQL only in SQL Server 2012仅在 SQL Server 2012 中注释的 T-SQL 上的 SQL 语法错误
【发布时间】:2013-09-27 21:01:51
【问题描述】:

我在使用 SQL Server 2012 在客户站点上安装时发生错误。我能够在 SQLExpress 2012 上本地重现语法错误。相同的 DDL 脚本在 2008 R2 下运行良好,但由于“'44445 附近的语法不正确”而失败'"。

检查正在执行的SQL,文本'44445'被注释掉了。同样,此 SQL 适用于 2008 R2。发布的最后一行是语法违规者。请注意,与本示例的大部分内容一样,它已被注释掉。

[snipped]    
IF NOT EXISTS (SELECT * FROM ::fn_listextendedproperty(N'Updatable' , N'USER',N'dbo', N'TABLE',N'PublishLog', NULL,NULL))
EXEC dbo.sp_addextendedproperty @name=N'Updatable', @value=N'True' , @level0type=N'USER',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'PublishLog'
GO

--SET ANSI_NULLS ON
--GO
--SET QUOTED_IDENTIFIER ON
--GO
--IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[MetaData]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
--BEGIN
--CREATE TABLE [dbo].[MetaData](
--  [ID] [int] IDENTITY(1,1) NOT NULL,
--  [DataName] [nvarchar](255) NULL,
--  [DataDescription] [nvarchar](255) NULL,
-- CONSTRAINT [MetaData_PK] PRIMARY KEY NONCLUSTERED 
--(
--  [ID] ASC
--) ON [PRIMARY]
--) ON [PRIMARY]
--END
--GO

--SET ANSI_NULLS ON
--GO

--SET QUOTED_IDENTIFIER OFF
--GO

--IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[T_MetaData_DTrig]') AND OBJECTPROPERTY(id, N'IsTrigger') = 1)
--EXEC dbo.sp_executesql @statement = N'CREATE TRIGGER [dbo].[T_MetaData_DTrig] ON [dbo].[MetaData] FOR DELETE AS
--SET NOCOUNT ON
--/* * PREVENT DELETES IF DEPENDENT RECORDS IN ''DocumentsData'' */
--IF (SELECT COUNT(*) FROM deleted, DocumentsData WHERE (deleted.ID = DocumentsData.MetaTagsID)) > 0
--    BEGIN
--        RAISERROR 44445 ''The record can''''t be deleted or changed. Since related records exist in table ''''DocumentsData'''', referential integrity rules would be violated.''
--        ROLLBACK TRANSACTION
--    END

[snipped]

【问题讨论】:

  • 您确定在 SQL Server 2012 上运行时没有发生自动换行吗?
  • 您是否尝试过使用/* ... */ 来评论该行?
  • 我检查了自动换行/隐藏和不可打印的字符。删除注释代码,DDL 工作正常。我可以简单地删除代码并交付它,但我很好奇是否有其他人看到过这种行为。'

标签: sql-server sql-server-2008 tsql


【解决方案1】:

他们停止使用 RAISERROR 语法。现在,你“需要”父母。

阅读:http://technet.microsoft.com/en-us/library/ms144262.aspx

然后搜索“RAISERROR”

【讨论】:

  • 除非它被注释掉应该被忽略。
【解决方案2】:

似乎引发错误的语法已更改 2008 R2 有 raiseerror(id, msg) - see here 对于 2012 年,它的 raiseerror(msg, id) - see here

所以在上面的示例中使用 RAISERROR(''test'',44445, 1) 有效

编辑 - 我刚刚检查过,RAISERROR(''test'',44445, 1) 也适用于 2008 R2

【讨论】:

  • 我阅读了您的引文,但看不出有什么不同。 msgid 是可选的。在 2012 年的第二次引用中,示例 A 和 C 省略了仅依赖于状态和严重性的消息编号。示例 B 类似于我的代码。我注意到的是,所有示例都使用了我的代码中缺少的状态和严重性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多