Как выполнить динамически созданный оператор SQL - PullRequest
3 голосов
/ 23 февраля 2011

Я хочу отбросить все ограничения таблиц, которые у меня есть. Поскольку это невозможно в SQL Server, я создал сценарий (основанный на чем-то, найденном в сети), который динамически создает операторы drop в результате операции Select:

SELECT 'ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + '] DROP CONSTRAINT [' + CONSTRAINT_NAME + ']'
    FROM information_schema.table_constraints
    WHERE CONSTRAINT_TYPE = 'FOREIGN KEY'
    AND TABLE_NAME LIKE 'Old_%''

Это сделано, я не могу найти, как его проанализировать и выполнить в цикле.

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

DECLARE @AlterTables nvarchar(2000)
SET @AlterTables = 'DECLARE Dyn_cursor CURSOR
FOR SELECT ''ALTER TABLE '' + TABLE_SCHEMA + ''.['' + TABLE_NAME + ''] DROP CONSTRAINT ['' + CONSTRAINT_NAME + '']''
FROM information_schema.table_constraints
WHERE CONSTRAINT_TYPE = ''FOREIGN KEY''
AND TABLE_NAME LIKE ''Old_%'''
Exec(@AlterTables)

Open Dyn_Cursor 
    FETCH NEXT FROM Dyn_Cursor INTO @name   
    WHILE @@FETCH_STATUS = 0   
BEGIN 
END

Close Dyn_cursor
Deallocate Dyn_cursor

Заранее спасибо, у кого есть решение для этого!

ура

J.

Ответы [ 2 ]

2 голосов
/ 03 марта 2011

Спасибо, JZD, однако это не сработало так, как вы рекомендовали. Я думаю, что необходимо объявить выбор, над которым вы работаете, прежде чем открывать курсор. Для этого я обновил код, подобный следующему (который я нашел в Интернете):

declare @str varchar(max)
declare cur cursor for
    SELECT 'ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + '] DROP CONSTRAINT [' + CONSTRAINT_NAME + ']'
    FROM information_schema.table_constraints
    WHERE CONSTRAINT_TYPE = 'FOREIGN KEY'
    AND TABLE_NAME LIKE 'Old_%'
    open cur
        FETCH NEXT FROM cur INTO @str
        WHILE (@@fetch_status = 0)
            BEGIN
                EXEC (@str)
                FETCH NEXT FROM cur INTO @str
            END
    close cur
deallocate cur 
0 голосов
/ 23 февраля 2011

Вы рядом.Ваш курсор не должен быть динамическим и должен просто выбирать ограничения таблицы.Затем вам нужно выполнить обновление внутри цикла, взять код здесь:

Open Dyn_Cursor 
    FETCH NEXT FROM Dyn_Cursor INTO @name   
    WHILE @@FETCH_STATUS = 0   
BEGIN 
--Add Here
END

и добавить что-то вроде этого между операторами Begin и End:

SET @AlterTable = 'ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + '] 
DROP CONSTRAINT ['' + @name + '']'
FROM information_schema.table_constraints
WHERE CONSTRAINT_TYPE = ''FOREIGN KEY''
AND TABLE_NAME LIKE ''Old_%'''
Exec(@AlterTable )
FETCH NEXT FROM Dyn_Cursor INTO @name
...