Оператор вставки SQL Server - PullRequest
       1

Оператор вставки SQL Server

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

В операторе вставки базы данных, который потенциально может вставить более одной строки, если в 1 строке (из многих) есть ошибка, как я узнаю, какая именно ошибка - какая строка и какой столбец? Есть идеи?

Ответы [ 2 ]

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

Если произойдет ошибка, транзакция будет отменена, и строки не будут вставлены.

Даже если вы явно не запускаете транзакцию с использованием begin transaction, SQL Server не будет запускать операторы insert вне транзакции. По умолчанию он запускается один для вас и фиксирует его после каждого оператора. См. Эту статью MSDN об автоматической фиксации.

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

select * into #tmp from <YourInsertQuery>
while @@rowcount > 0
    begin        
    insert into TargetTable 
    select top 1 * 
    from #tmp tmp
    where not exists (
        select * 
        from TargetTable tt
        where tt.id = tmp.id
    )
    order by id
    end

Если это не удастся, то верхняя строка в #tmp, которой нет в TargetTable, вызывает ошибку.

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...