似乎无法与SQL Server中的varchar进行比较

时间:2017-01-15 08:51:47

标签: sql-server triggers compare varchar

我试图确保当人们创建表时,它以前缀tbl

开头

以下是我现在所做的事情:

CREATE TRIGGER trg_tbl ON DATABASE
FOR CREATE_TABLE
AS
    DECLARE @name VARCHAR(25)

    SET @name = (SELECT TOP 1 name 
                 FROM sys.tables 
                 ORDER BY create_date DESC)

    IF (SELECT SUBSTRING(@name, 1, 3) != 'tbl'
       PRINT 'Tables must begin with the prefix tbl'

    ROLLBACK
GO

问题是它不允许我使用!=运算符。我尝试使用= <>LIKE,但似乎没有任何效果它一直告诉我语法不正确请帮助我在网上到处查看并且每个人都说=或{ {1}}工作。 :(

2 个答案:

答案 0 :(得分:3)

虽然另一个答案解释了代码中的问题。我建议你使用Eventdata()函数来检索表名

即使表格名称以DDL开头,您的rollback触发器也会Create Table每次tb1次操作。仅当表名不以rollback开头时,您才需要应用tb1IF条件内移动rollback命令。

BEGIN-END条件具有多个语句时使用IF阻止,否则将在IF条件内单独考虑第一个语句。

CREATE TRIGGER trg_tbl
ON DATABASE
FOR CREATE_TABLE
AS
  BEGIN
      SET NOCOUNT ON

      DECLARE @TABLE_NAME SYSNAME

      SELECT @TABLE_NAME = Eventdata().value('(/EVENT_INSTANCE/ObjectName)[1]', 'SYSNAME')

      IF LEFT (@TABLE_NAME, 3) != 'tbl'
        BEGIN
            PRINT 'Tables must begin with the prefix tbl'

            ROLLBACK
        END
  END

GO 

答案 1 :(得分:2)

错误是因为在:

处缺少结束括号
IF (SELECT SUBSTRING(@name,1,3) != 'tbl'

可以通过添加缺少的右括号来修复:

IF (SELECT SUBSTRING(@name,1,3)) != 'tbl'

但是,您不需要执行select来执行子字符串。

你可以这样做:

IF SUBSTRING(@name,1,3) != 'tbl'