Оценить динамическое имя столбца внутри функции обновления в триггере T-SQL [дубликат]

До появления спецификации 5-го издания метод Date.parse был полностью зависимым от реализации (new Date(string) эквивалентен Date.parse(string) кроме последнего возвращает число, а не Date). В спецификации 5-го издания было добавлено требование о поддержке упрощенного (и немного неправильного) ISO-8601 , но кроме этого было требование no для того, что Date.parse / new Date(string) должны принять иное, чем то, что они должны были принять любой вывод Date # toString (не сказав, что это было).

Как и в ECMAScript 2017 (издание 8), реализации необходимо было проанализировать их вывод для Дата # toString и Дата # toUTCString , но формат этих строк не был указан.

Начиная с ECMAScript 2019 (версия 9) формат для Дата # toString и Дата # toUTCString указана как (соответственно):

  1. ddd MMM DD YYYY HH: mm: ss ZZ [(имя часового пояса)] например Вт 10 июля 2018 18:39:58 GMT + 0530 (IST)
  2. ddd, DD MMM YYYY HH: mm: ss Ze.g. Вт 10 июл 2018 13:09:58 GMT

предоставление еще 2 форматов, которые Date.parse должны корректно анализировать в новых реализациях (отмечая, что поддержка не является вездесущей и несовместимые реализации будут оставаться в использовании в течение некоторого времени).

Я бы рекомендовал, чтобы строки даты обрабатывались вручную, а конструктор даты Date использовался с аргументами года, месяца и дня, чтобы избежать двусмысленность:

// parse a date in yyyy-mm-dd format
function parseDate(input) {
  var parts = input.split('-');
  // new Date(year, month [, day [, hours[, minutes[, seconds[, ms]]]]])
  return new Date(parts[0], parts[1]-1, parts[2]); // Note: months are 0-based
}

-1
задан Andro Miguel M. Bondoc 28 February 2013 в 07:51
поделиться

2 ответа

Несколько вещей: вы можете обработать первый раз через цикл, потому что имя не изменилось бы в первый раз. Вы можете захотеть обработать, когда @ColumnName имеет значение null, потому что это означает, что ваш запрос не возвратил строку, хотя ваш запрос ниже всегда должен возвращать значение.

DECLARE @ColumnCount INT 
DECLARE @ColumnCounter INT 
DECLARE @ColumnName NVARCHAR(max) 
DECLARE @temp varchar(max)

SET @ColumnCounter = 0 

SELECT @ColumnCount = Count(c.column_name) 
FROM   information_schema.columns c 
WHERE  c.table_name = 'Province' 

WHILE @ColumnCount >= @ColumnCounter 
  BEGIN 
      SET @ColumnName = NULL 

      SELECT @ColumnName = c.column_name 
      FROM   information_schema.columns c 
      WHERE  c.table_name = 'Province' 
             AND c.ordinal_position = @ColumnCounter 

      IF ( @ColumnName != @temp ) 
        BEGIN 
        --do something 
        END
      SET @temp = @ColumnName
      SET @ColumnCounter = @ColumnCounter + 1 
  END 
1
ответ дан darin 18 August 2018 в 19:15
поделиться
  • 1
    спасибо, я попробую это позже XD – Andro Miguel M. Bondoc 28 February 2013 в 07:20
  • 2
    hmmm, как я могу проверить, обновлен ли столбец? мой код помещается в триггер после обновления – Andro Miguel M. Bondoc 28 February 2013 в 07:47
  • 3
    О, триггерная часть нигде не упоминалась. Вы не можете выполнить проверку имени переменной для оператора в триггере. См. Ответ ниже. – darin 28 February 2013 в 16:08

для проверки столбца фактически обновляется после триггера обновления, вы можете использовать специальные таблицы deleted и inserted msdn , в которых триггерный код может находить старые и новые версии строк таблицы обновления

помните, что в каждой таблице можно найти более 1 строки. например, вы выполняете update table1 set col1 = value1 where some_condition в триггерном количестве строк, влияющих на some_condition, будут представлены в inserted и deleted таблицах

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

, функция update() принимает в качестве имени столбца параметра не переменную sting с именем в качестве значения

например, используя update() в триггерах, проверьте , этот update(some_column) является истинным, когда some_column присутствует в операторе update set, даже значение столбца не изменяется.

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

declare @count int = 0
if update(col1) set @count = @count + 1
if update(col2) set @count = @count + 1
...
5
ответ дан shibormot 18 August 2018 в 19:15
поделиться
  • 1
    Другой способ подсчета столбцов «обновленный» - подсчитать установленные биты в результате из Columns_Updated() . Имена столбцов не нужны. – HABO 15 June 2018 в 20:05
Другие вопросы по тегам:

Похожие вопросы: