Удалить все синонимы с помощью курсора

#sql-server-2008r2-express

#sql-server-2008r2-express

Вопрос:

Я хотел удалить все синонимы базы данных (sql server 2008 r2) с помощью курсора. имя базы данных среды — ‘mydatabase’, имя схемы — ‘dbo’.. Не могли бы вы, пожалуйста, указать мне, как я пытался, но оператор while .. end, не удается удалить синоним. какая логика должна применяться к курсору?

Ответ №1:

Нет необходимости использовать курсор. Сделайте это как установлено:

 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
  

Ответ №2:

Аналогично ответу Джейсона с некоторыми улучшениями

  • Используйте функцию 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