0

sp_MSforeeachdb を使用してマルチデータベース クエリを作成しようとしていますが、実行時にエラーが発生します。SQL SSMS には表示可能な構文エラーがないため、これが発生しているかどうかはわかりません

これが私が書いたSQLです:

EXEC sp_MSforeachdb N'IF ''?'' in (''db1'',''db2'')
BEGIN
PRINT ''Use [?]''
PRINT ''DROP FUNCTION uf_EncryptAES;'' 
PRINT ''GO''
PRINT ''DROP FUNCTION uf_DecryptAES;''
PRINT ''GO''
PRINT ''DROP ASSEMBLY MVE_Crypt;''
PRINT ''GO''
PRINT ''CREATE ASSEMBLY MVE_Crypt from ''''C:\MVE_Crypt.dll'''' WITH PERMISSION_SET = unsafe;''
PRINT ''GO''
PRINT ''CREATE FUNCTION uf_EncryptAES(@input nvarchar(4000),@key nvarchar(4000)) returns nvarchar(4000) EXTERNAL NAME MVE_Crypt.[MVE_Crypt.MVE_Crypt].EncryptAES;''
PRINT ''GO''
PRINT ''CREATE FUNCTION uf_DecryptAES(@input nvarchar(4000),@key nvarchar(4000)) returns nvarchar(4000) EXTERNAL NAME MVE_Crypt.[MVE_Crypt.MVE_Crypt].DecryptAES;''
PRINT ''GO''
END'

これを実行すると、次のエラーが表示されます。

メッセージ 105、レベル 15、状態 1、行 14 文字列 'CREATE' の後の閉じられていない引用符。

エラーは最初のステートメントではなく 2 番目の create function ステートメントにあるように見えますが、同じように記述されているため意味がありません。

SQL Server 2012 Enterprise SP1 を使用しています。

前もって感謝します!

4

2 に答える 2

0

答えが見つかりました!さらにテストを重ねた結果、スクリプトが (''db1'',''db2'') のセクションを気に入らないことがわかりました。

だから私はそれを

EXEC sp_MSforeachdb N'IF ''?'' in (Select database_name from databaselist.dbo.sometable) 

そのため、データベースに名前を付ける代わりに、select ステートメントを使用して、データベースがリストされているテーブルからデータベースをプルしました。これは完璧に機能しました。

于 2013-08-12T13:57:53.897 に答える
0

多分問題はあなたのものではなく、sp_MSForEachDB.

ストアド プロシージャを実行しています。標準の方法ではなく、SSIS のようにパラメータを読んでよろしいですか?

私は使用してみてDB_NAME()ください:

EXEC sp_MSforeachdb N'IF '''' + DB_NAME() + '''' in (''db1'',''db2'')
BEGIN
PRINT ''Use [?]''
PRINT ''DROP FUNCTION uf_EncryptAES;'' 
PRINT ''GO''
PRINT ''DROP FUNCTION uf_DecryptAES;''
PRINT ''GO''
PRINT ''DROP ASSEMBLY MVE_Crypt;''
PRINT ''GO''
PRINT ''CREATE ASSEMBLY MVE_Crypt from ''''C:\MVE_Crypt.dll'''' WITH PERMISSION_SET = unsafe;''
PRINT ''GO''
PRINT ''CREATE FUNCTION uf_EncryptAES(@input nvarchar(4000),@key nvarchar(4000)) returns nvarchar(4000) EXTERNAL NAME MVE_Crypt.[MVE_Crypt.MVE_Crypt].EncryptAES;''
PRINT ''GO''
PRINT ''CREATE FUNCTION uf_DecryptAES(@input nvarchar(4000),@key nvarchar(4000)) returns nvarchar(4000) EXTERNAL NAME MVE_Crypt.[MVE_Crypt.MVE_Crypt].DecryptAES;''
PRINT ''GO''
END'
于 2013-08-12T07:34:23.037 に答える