SQL Server Сравните значение поля со значением по умолчанию

StackOverflow https://stackoverflow.com/questions/460873

  •  19-08-2019
  •  | 
  •  

Вопрос

Мне нужно перебрать поля таблицы и что-то сделать, если его значение не равно значению по умолчанию.

Я нахожусь в триггере и поэтому знаю имя таблицы. Затем я перебираю каждый из поля, использующие этот цикл:

select @field = 0, @maxfield = max(ORDINAL_POSITION) from
INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = @TableName

while @field < @maxfield
begin
...

Затем я могу получить имя поля на каждой итерации через цикл:

select @fieldname = COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME = @TableName
and ORDINAL_POSITION = @field

И я могу получить значение по умолчанию для этого столбца:

select @ColDefault = SUBSTRING(Column_Default,2,LEN(Column_Default)-2)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE Table_Name = @TableName
AND Column_name = @fieldname

У меня есть все, что мне нужно, но я не вижу, как потом сравнить 2. Потому что У меня нет имени поля как константы, только в переменной, я не вижу как получить значение из таблицы «вставлено» (помните, я в триггере) для того, чтобы увидеть, если оно совпадает со значением по умолчанию (теперь хранится в @ColDefault как varchar).

Это было полезно?

Решение

Во-первых, помните, что триггер может быть запущен одновременно с несколькими входящими записями. Если я сделаю это:

INSERT INTO dbo.MyTableWithTrigger
  SELECT * FROM dbo.MyOtherTable

тогда мой триггер на MyTableWithTrigger должен будет обрабатывать более одной записи. & Quot; вставлен & Quot; псевдотаблица будет содержать более одной записи.

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

DECLARE @sqlToExec VARCHAR(8000)
SET @sqlToExec = 'SELECT * FROM INSERTED WHERE [' + @fieldname + '] <> ' + @ColDefault
EXEC(sqlToExec)

Это вернет все строки из вставленной псевдотаблицы, которые не соответствуют значениям по умолчанию. Звучит так, будто вы хотите что-то сделать с этими строками, поэтому вам может потребоваться создать временную таблицу, прежде чем вызывать эту строку @sqlToExec, и вместо простого выбора данных вставить ее в временную таблицу. Затем вы можете использовать эти строки для выполнения любой необходимой обработки исключений.

Одна загвоздка - этот T-SQL работает только для числовых полей. Возможно, вы захотите создать отдельную обработку для разных типов полей. У вас могут быть VARCHAR, числовые значения, BLOB-объекты и т. Д., И вам потребуются различные способы их сравнения.

Другие советы

Я подозреваю, что вы можете сделать это с помощью и exec.

Но почему бы просто не сгенерировать код один раз. Это будет более производительным

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top