Я хочу удалить все синонимы базы данных (sql server 2008 r2) с помощью курсора. environment-database name- 'mydatabase', имя схемы- 'dbo' .. Можете ли вы, пожалуйста, направить меня, как я пытался, но утверждение while .. end, не может отказаться от синонима. Какую логику следует применять w.r.t cursor?Отбросить все синонимы с помощью курсора
4
A
ответ
14
Не нужно использовать курсор. Сделайте это, как набор:
declare @n char(1)
set @n = char(10)
declare @stmt nvarchar(max)
select @stmt = isnull(@stmt + @n, '') +
'drop synonym [' + SCHEMA_NAME(schema_id) + '].[' + name + ']'
from sys.synonyms
exec sp_executesql @stmt
1
Подобный ответ Джейсона с некоторыми улучшениями
- Использование Quotename() функция, чтобы обернуть имена в квадратных скобках
- Инициализировать переменную @sql в пустую строку, это означает, что isnull не требуется, и означает, что когда вы объединяете результаты запроса в одну строку, он не получает тип неправильным. Строковые литералы в конкатенации могут принимать размер nvarchar по умолчанию и заставлять вашу итоговую строку обрезать неожиданно.
- Убедитесь, что строковые литералы также являются nvarchar, используя N перед ними.
- Фильтр только для схемы dbo, как запросил OP.
- Добавить схему SYS к sp_executesql вызова
Полностью согласен, это не то, где вам нужен курсор.
DECLARE @SQL NVARCHAR(MAX) = N''
SELECT @SQL += N'DROP SYNONYM ' + QUOTENAME(SCHEMA_NAME([schema_id])) + N'.' + QUOTENAME(name) + N';' + Char(13) + Char(10)
FROM sys.synonyms
WHERE SCHEMA_NAME([schema_id]) = N'dbo'
EXEC sys.sp_executesql @SQL