#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