似乎无法与SQL Server中的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但似乎没有任何效果,它一直告诉我语法不正确,请帮助我在网上到处查找,每个人都说=LIKE工作。:(

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

此外,您的DDL触发器将rollback每个Create Table操作,即使表名以 tb1 开头。仅当表名不以 rollback 开头时才需要应用 tb1IF 条件内移动回滚命令。

当条件有多个语句时IF请使用BEGIN-END块,否则第一个语句将在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 

错误是由于缺少以下处的右括号:

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

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

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

但是,您无需执行选择即可执行子字符串。

您可以这样做:

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

相关内容

  • 没有找到相关文章

最新更新