2017-01-15 93 views
1

Я пытаюсь, чтобы убедиться, что, когда люди создают таблицы начинается с префикса tblНе могу сравнить с VARCHAR в SQL Server

Вот что я сделал, как сейчас:

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 работают. :(

+0

Ну, если вы глупы, как и я не знаю, как Дикса ваша проблема не забудьте закрыть вы ВЫБРАТЬ, как так (SELECT SUBSTRING (@ имя, 1,3))! = «ТПС» Тогда все будет be fine –

ответ

2

Ошибка из-за отсутствующей закрывающей скобки в:

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

может быть исправлена ​​путем добавления недостающих закрывающую скобку:

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

Однако, вам не нужно делать выбрать для выполнения подстроки

Вы можете сделать это:.

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

Thx ребята, теперь, когда мне ответили, мне нужно закрыть или проверить ответ. ??? Новое на этом сайте –

+0

Вы должны принять ответ. Просто нажмите на отметку ниже кнопок для голосования – Hadi

+0

@TristanClaude установил этот ответ как принятый, так как этот скриншот

3

Хотя другой ответ объясняет проблему в вашем коде. Я предлагаю вам использовать Eventdata() функцию, чтобы получить имя таблицы

Кроме того, ваш DDL триггера будет rollback каждого Create Table действия, даже если имя таблицы начинается с tb1. Вам необходимо применить rollback, только если имя таблицы не начинается с tb1, переместите команду отката в состояние IF.

Использовать 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 

 Смежные вопросы

  • Нет связанных вопросов^_^