DECLARE @SQLStatement VARCHAR(4000)
DECLARE @T_DBuser TABLE (DBName SYSNAME, UserName SYSNAME, AssociatedDBRole NVARCHAR(256))
SET @SQLStatement = 'SELECT
''?'' AS DBName,dp.name AS UserName,USER_NAME(drm.role_principal_id) AS AssociatedDBRole
FROM ?.sys.database_principals dp
LEFT OUTER JOIN ?.sys.database_role_members drm ON dp.principal_id = drm.member_principal_id
WHERE dp.sid NOT IN (0x01) AND dp.sid IS NOT NULL
AND dp.type NOT IN (''C'')
AND dp.is_fixed_role <> 1
AND dp.name NOT LIKE ''##%''
AND ''?'' NOT IN (''master'',''msdb'',''model'',''tempdb'')
ORDER BY DBName'
INSERT @T_DBuser
EXEC sp_MSforeachdb @SQLStatement
SELECT *
FROM @T_DBuser
ORDER BY DBName
我在找到的LoginUserPermission.zip文件中使用此代码 https://gallery.technet.microsoft.com/scriptcenter/Get-logins-databases-816f66b2
当我尝试仅运行此部分时,我收到此错误:(34行(s)受影响)
Msg 102,Level 15,State 1,Line 3
“ - ”附近的语法不正确。
代码的所有其他部分都可以正常工作。我试图分解select语句,我收到一条消息
Msg 102,Level 15,State 1,Line 1
“?”附近的语法不正确。
疯狂的事情是两周前剧本运作得很好。我所要做的就是更改数据库名称并运行。
答案 0 :(得分:1)
您的某个数据库名称中包含短划线(' - ')。在“?”周围放置方括号FROM中的参数和查询的LEFT JOIN。
...
FROM [?].sys.database_principals dp
LEFT OUTER JOIN [?].sys.database_role_members drm
ON dp.principal_id = drm.member_principal_id
...