似乎无法与 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
我试图确保当人们创建表时它以前缀 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