如何修改SQL脚本获取服务器所有数据库的数据库范围凭据?
解决跨库查询数据库范围凭据的语法错误
你当前的脚本存在三个关键语法问题,导致报错:
- 拼接字符串时多了一个多余的
+号:SELECT ' + + quotename(name) + ' - 没有用
UNION ALL拼接多个数据库的查询语句,直接多个SELECT会引发语法冲突 - 直接使用
quotename(name)作为database_name的值,会被解析为对象名而非字符串,需要用quotename(name, '''')生成带单引号的字符串常量
以下是修正后的完整脚本:
declare @sqlcred nvarchar(max); SELECT @sqlcred = (select ' UNION ALL SELECT ' + quotename(name, '''') + ' AS database_name, c.name COLLATE DATABASE_DEFAULT AS credential_name, c.credential_identity COLLATE DATABASE_DEFAULT AS credential_identity FROM '+ quotename(name) + '.sys.database_scoped_credentials c' from sys.databases where state=0 order by [name] for xml path(''), type).value('.', 'nvarchar(max)'); -- 去掉开头多余的UNION ALL set @sqlcred = stuff(@sqlcred, 1, 12, '') + ' order by database_name, credential_name, credential_identity' CREATE TABLE #CRED ( database_name nvarchar(max), credential_name nvarchar(max), credential_identity nvarchar(max) ) INSERT INTO #CRED EXEC (@sqlcred); SELECT * FROM #CRED DROP TABLE #CRED
修正说明:
- 移除了
SELECT ' + + quotename(name)中多余的加号,改为SELECT ' + quotename(name, '''') - 在每个库的查询语句前添加
UNION ALL,确保多库结果能正确合并 - 使用
quotename(name, '''')将数据库名转换为带单引号的字符串,避免被解析为对象标识符 - 保留了原脚本中
COLLATE DATABASE_DEFAULT的设置,确保跨库查询时字符集一致
内容的提问来源于stack exchange,提问作者Ludie Bitner
相关产品推荐
相关产品推荐

