Как определить последнюю строку в операторе вставки - PullRequest
2 голосов
/ 26 января 2010

Я хочу знать, какая запись вставлена ​​последней в таблицу подробностей B в следующем порядке ... например, если у меня есть:

1 row Header Table A
--------------------
1 row Detail Table B
2 row Detail Table B
3 row Detail Table B
4 row Detail Table B (last)

Я хочу сделать T-SQL или запустить процедуру, если вставлена ​​4 строка ... Заранее спасибо!

Использование SQL-Server 2000

Ответы [ 5 ]

4 голосов
/ 26 января 2010

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

2 голосов
/ 26 января 2010
1 голос
/ 27 января 2010

Посмотрите на некоторую справку по триггерам, как указано выше, а затем, возможно, посмотрите на специальные таблицы вставок и удалений, созданные и используемые триггерами.

В операторах триггера используются две специальные таблицы: удаленная таблица и вставленная таблица. Microsoft® SQL Server автоматически создает и управляет этими таблицами. Вы можете использовать эти временные резидентные таблицы, чтобы проверить влияние определенных изменений данных и установить условия для действий триггера; однако вы не можете изменять данные в таблицах напрямую.

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

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

0 голосов
/ 27 января 2010

Использование IDENTITY для определения, какая запись была вставлена ​​последней, может быть очень обманчивым. Что, если некоторые записи были удалены, и вы сбросили начальное значение IDENTITY?

Например, вы могли бы иметь записи 1–10000, но удалить из 1000–9000, и вы решили сбросить свою личность, чтобы начать снова с 1000?

Триггеры, с другой стороны, могут работать, но вы должны тщательно взвесить последствия. Это может увеличить нагрузку на вашу систему.

Как вы вставляете записи? Через приложение?

Я предлагаю рассмотреть добавление столбца метки времени (или даже просто обычного столбца DATETIME со значением по умолчанию GETDATE ()). Это может помочь определить, какая запись была вставлена ​​последней в вашей транзакции. Например:

-- begin your transaction 

-- insert statements here 

SELECT id
FROM TableB
WHERE timestampcol = (SELECT MAX(timestampcol) FROM TableB)

-- run your sproc based on the last record inserted

-- commit or rollback your transaction
0 голосов
/ 26 января 2010

Есть ли в этой таблице столбец идентификаторов (например, "TableBId")? Это числовая колонка, о которой говорит Рэнди Миндер в своем ответе. Если это так, то довольно просто использовать функцию ORDER BY:

SELECT TOP 1 * FROM TableB ORDER BY Id DESC

Если у вас нет столбца идентификаторов, вы можете добавить его, создав новый столбец (Id), указав его в качестве первичного ключа и включив его спецификацию идентификации.

Если вы хотите запустить SQL после вставки нового элемента в таблицу, вы можете использовать триггер вставки.

Можете прочитать о триггерах здесь или посмотреть ссылки ниже:)

...