SQL Server Сравните значение поля со значением по умолчанию - PullRequest
0 голосов
/ 20 января 2009

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

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

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).

Ответы [ 2 ]

2 голосов
/ 17 января 2011

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

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

2 голосов
/ 20 января 2009

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

INSERT INTO dbo.MyTableWithTrigger
  SELECT * FROM dbo.MyOtherTable

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

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

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

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

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

...