Он жалуется на невозможность связать в вызове OBJECT_ID
, ваш код приводит к чему-то вроде:
IF OBJECT_ID(STAGE.dbo.STG_KLIENT) IS NOT NULL DROP TABLE STAGE.dbo.STG_KLIENT
Часть DROP TABLE
в порядке, но вам нужно указать имя таблицы в кавычкахв вашем вызове OBJECT_ID
, поскольку он ожидает ввода (N)VARCHAR
, поэтому используйте:
select @sql = 'IF OBJECT_ID('''+@stg_table+''') IS NOT NULL DROP TABLE '+@stg_table
-- ^^ ^^
Кроме того, ваш код немного повсюду.Он пропустит некоторые таблицы, потому что то, что вы делаете:
- Выборка из курсора (1-й результат, давайте предположим, что выбран тип)
- Проверьте, если @insert_type = 'select',true, поэтому давайте войдем в блок
- удалить таблицу, если она существует
- извлечь из курсора (2-й результат, давайте снова предположим, что выбран тип
- оставьте, если блок
- Проверить, если @insert_type = 'insert', false, не обрезать
- напечатать имя таблицы
- извлечь следующий из курсора -> 3-й результат, вы просто ничего не сделалисо вторым результатом, где вы должны были его опустить.
Вот немного улучшенная версия:
while @@FETCH_STATUS = 0
begin
if @insert_type = 'select'
begin
select @sql = 'IF OBJECT_ID('''+@stg_table+''') IS NOT NULL DROP TABLE '+@stg_table
end
else if @insert_type = 'insert'
begin
select @sql = 'TRUNCATE TABLE ' + @stg_table
end
print @sql -- "debugging"
-- only do those once if you can, so you don't get lost in how the code branches
exec sp_executesql @sql
fetch next from kursor into @insert_type, @stg_table, @src;
end
Кроме того, вам не нужен курсор для этого.просто сгенерируйте большой запрос и выполните его один раз.
DECLARE @sql NVARCHAR(MAX) = ''
SELECT @sql += CONCAT(CASE
WHEN meta.insert_table = 'select'
AND OBJECT_ID(meta.stg_table) IS NOT NULL
THEN CONCAT('DROP TABLE ', meta.stg_table)
WHEN meta.insert_table = 'insert'
THEN CONCAT('TRUNCATE TABLE', meta.stg_table)
END,
';', CHAR(13), CHAR(10)) -- add newline for easier reading
FROM METADATA.dbo.META_SOURCESTAGE meta
PRINT @sql
EXEC sp_executesql @sql
Это должно сработать, и хотя я не проверял его, надеюсь, вы поняли идею.