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”后的未闭合引号。

该错误似乎出现在第二个 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 回答