2011-05-11 4 views
4

Я хочу удалить все синонимы базы данных (sql server 2008 r2) с помощью курсора. environment-database name- 'mydatabase', имя схемы- 'dbo' .. Можете ли вы, пожалуйста, направить меня, как я пытался, но утверждение while .. end, не может отказаться от синонима. Какую логику следует применять w.r.t cursor?Отбросить все синонимы с помощью курсора

ответ

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 

 Смежные вопросы

  • Нет связанных вопросов^_^