Каковы наилучшие методы обеспечения повторного запуска вашего SQL-запроса без получения ошибок при последующих запусках?
например.
- проверка того, что таблицы не существуют до их создания
- проверка того, что столбцы еще не существуют до создания или переименования
- транзакции с откатом при ошибке
- Если вы удаляете таблицы, которые существуют, прежде чем создавать их заново, сначала отбросьте их зависимости, и не забудьте их воссоздать после
- Использование CREATE ИЛИ ALTER PROCEDURE вместо CREATE PROCEDURE или ALTER PROCEDURE, если ваш аромат SQL поддерживает его
- Поддерживать внутреннюю схему управления версиями, поэтому один и тот же SQL просто не запускается дважды в первую очередь. Таким образом, вы всегда знаете, где находитесь, глядя на номер версии.
-
Экспортируйте существующие данные в операторы INSERT и полностью воссоздайте всю БД с нуля.
-
отбрасывая таблицы перед их созданием (не самая безопасная вещь когда-либо, но будет работать в крайнем случае, если вы знаете, что делаете)
изменить: Я искал что-то вроде этого:
IF EXISTS ( SELECT *
FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[foo]')
AND OBJECTPROPERTY(object_id, N'IsUserTable') = 1 )
DROP TABLE foo
Используют ли другие утверждения такие, как это или что-то лучше?
изменить: Мне нравится предложение Jhonny:
IF OBJECT_ID('table_name') IS NOT NULL DROP TABLE table_name
Я делаю это для добавления столбцов:
IF NOT EXISTS ( SELECT *
FROM SYSCOLUMNS sc
WHERE EXISTS ( SELECT id
FROM [dbo].[sysobjects]
WHERE NAME LIKE 'TableName'
AND sc.id = id )
AND sc.name = 'ColumnName' )
ALTER TABLE [dbo].[TableName] ADD [ColumnName]