You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

修正说明:

  1. 移除了SELECT ' + + quotename(name)中多余的加号,改为SELECT ' + quotename(name, '''')
  2. 在每个库的查询语句前添加UNION ALL,确保多库结果能正确合并
  3. 使用quotename(name, '''')将数据库名转换为带单引号的字符串,避免被解析为对象标识符
  4. 保留了原脚本中COLLATE DATABASE_DEFAULT的设置,确保跨库查询时字符集一致

内容的提问来源于stack exchange,提问作者Ludie Bitner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 18:56:13