似乎无法与 SQL 服务器中的 varchar 进行比较

Can't seem to compare to varchar in SQL Server

我试图确保当人们创建表时它以前缀 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工作。 :(

错误是因为缺少右括号:

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

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

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

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

你可以这样做:

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

尽管其他答案在您的代码中解释了问题。我会建议你使用 Eventdata() 函数来检索 table name

即使 table 名称以 tb1 开头,您的 DDL 触发器也会 rollback 每个 Create Table 动作。仅当 table 名称不以 tb1 开头时才需要应用 rollback 将回滚命令移动到 IF 条件内。

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