5

カーソルを使用して、データベース (SQL Server 2008 r2) のすべてのシノニムを削除したいと考えていました。environment-database name- 'mydatabase', schema name- 'dbo'.. 試してみましたが、while .. end のステートメントでシノニムを削除できません。カーソルに対してどのロジックを適用する必要がありますか?

4

2 に答える 2

18

カーソルを使用する必要はありません。設定どおりに実行します:

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
于 2011-07-20T19:47:29.753 に答える
3

いくつかの改善を加えたジェイソンの答えに似ています

  • Quotename() 関数を使用して、名前を角かっこで囲みます
  • @SQL 変数を空の文字列に初期化します。これは、isnull が不要であることを意味し、クエリの結果を単一の文字列に連結するときに型が間違っていないことを意味します。連結内の文字列リテラルは、既定の nvarchar サイズを使用し、結果の文字列が予期せず切り捨てられる可能性があります。
  • 文字列リテラルの前に N を使用して、文字列リテラルも nvarchar であることを確認します。
  • OPが要求したように、dboスキーマのみにフィルタリングします。
  • sp_executesql 呼び出しに sys スキーマを追加します。

これはカーソルが必要な場所ではないことに完全に同意します。

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
于 2015-02-18T00:09:31.157 に答える