用于为服务器生成用户访问列表的SQL查询

时间:2016-05-19 17:59:41

标签: sql sql-server excel report

我在SQL Server中构建了一些表和查询,但现在我不知道如何让它们在这个最新的任务中协同工作。 有一张桌子,我们称之为ServerAssessment。它有一个服务器清单,例如它们的名称和服务器版,它们是Developer,Production,Unknown等。有一个更大的表名为DatabaseDetails,其中包含数千条关于ID的记录。每行都有一个服务器名称,一个用户名和此处不需要的其他详细信息。 我遇到的困难是我需要生成一个只列出开发人员服务器(WHERE Server Edition ='Developer')的查询,然后跟进并列出其后的每个不同的用户名(来自DatabaseDetails)。 从SQL逻辑的角度来看,我不确定这是如何最好地完成的。我觉得它看起来像这样吗?或者我是从错误的角度完全来到这里的?

ServerA001  User00001   User00002   User00003   User00111
ServerA015  User00001   User00002   User60005   User29031   User11111
ServerC037  User00001   User00009
ServerD066  User00001   User00002   User00003   User12312   User12333, User14141
ServerN123  User00001   User00003   User00009

同样,用户可以访问许多服务器。应该不是通过不同的服务器列出所有内容,而是将所有内容转换为不同的/唯一的用户,然后列出服务器?在专业氛围中,人们会更理想吗?

我现在所有的东西都是短暂而甜蜜的,加入表格并确保只返回Developer。

SELECT
    DISTINCT [Server Name]
    , [Server Edition]
FROM [ServerAssessment] AS tabDI
    FULL JOIN [DatabaseDetails] AS tabUD
        ON tabDI.[Server Name] = tabUD.[Server Name]
WHERE [SQL Server Edition] = 'Developer'
ORDER BY [Computer Name] ASC

PS:这些最初是Excel中的表格,但我将其导入SQL Server,因为在过去的几个月里,我对SQL的工作感觉更舒服。

2 个答案:

答案 0 :(得分:0)

首先,使用完全连接将为您提供与开发人员服务器不直接相关的详细信息的记录。您希望使用左连接来获取所有开发服务器,但只获取与它们相关的详细信息。

其次,如果要在SQL中执行此操作,则必须查找如何执行动态sql pivot。创建报告时会出现问题,因为列数会发生变化。我建议你使用一个可以为你自动转动的报告工具。我使用SSRS /

做了类似的事情

答案 1 :(得分:0)

我会使用ROW_NUMBER函数来处理PIVOT运算符:

SELECT  *
FROM (
    SELECT /*DISTINCT*/ tabDI.[ServerName], [UserName], 
        ColNum = ROW_NUMBER() OVER(PARTITION BY tabDI.[ServerName] ORDER BY [UserName])
    FROM (VALUES 
        ('ServerA001', 'Developer'),
        ('ServerA002', 'Enterprise'),
        ('ServerA015', 'Developer')
    ) AS tabDI ([ServerName], [SQL Server Edition]) -- [ServerAssessment]
    LEFT JOIN (VALUES -- LEFT JOIN for servers without users
        ('ServerA001', 'User00001'),
        ('ServerA001', 'User00002'),
        ('ServerA001', 'User00003'),
        ('ServerA001', 'User00006'),
        ('ServerA002', 'User00001'),
        ('ServerA015', 'User00003'),
        ('ServerA015', 'User00004') 
    ) AS tabUD ([ServerName], [UserName]) -- [DatabaseDetails]
    ON tabDI.[ServerName] = tabUD.[ServerName]
    WHERE [SQL Server Edition] = 'Developer'
) x
PIVOT ( MAX(x.UserName) FOR x.ColNum IN ([1], [2], [3], [4] /*, ...*/) ) y
ORDER BY y.[ServerName]

注意:此解决方案适用于数量有限的用户(在上述情况下为4)。