0

因此,我正在编写一份报告,将所有版本的 adobe acrobat pro 合并到一个 sql 报告中。我遇到的问题是 Adob​​e 将其命名约定从一个版本更改为另一个版本。一些显示“Adobe Acrobat 7.1.0 Professional”,而另一些显示“Adobe Acrobat 9 Pro”。我的问题是我可以在另一列中显示版本,但是否可以只显示所有不同版本的“Adobe Acrobat Pro”并解析#?

另外请原谅我,我对整个 sql 查询的东西还是很陌生。但是我做了很多挖掘工作,似乎找不到任何对我有用的东西。

提前致谢

斯科特

SELECT DISTINCT 
                      v_GS_ADD_REMOVE_PROGRAMS_5.DisplayName0 AS [Display Name], LEFT(v_GS_ADD_REMOVE_PROGRAMS_5.Version0, 1) AS Version, 
                      v_GS_ADD_REMOVE_PROGRAMS_5.Publisher0 AS Publisher, v_R_System_5.User_Name0 AS [User Name], 
                      v_R_System_5.Name0 AS [Computer Name], DATEDIFF(day, v_GS_WORKSTATION_STATUS_5.LastHWScan, GETDATE()) AS [Last Scan]
FROM         v_GS_ADD_REMOVE_PROGRAMS AS v_GS_ADD_REMOVE_PROGRAMS_5 INNER JOIN
                      v_R_System AS v_R_System_5 ON v_GS_ADD_REMOVE_PROGRAMS_5.ResourceID = v_R_System_5.ResourceID INNER JOIN
                      v_R_System_Valid AS v_R_System_Valid_5 ON v_R_System_5.ResourceID = v_R_System_Valid_5.ResourceID INNER JOIN
                      v_GS_WORKSTATION_STATUS AS v_GS_WORKSTATION_STATUS_5 ON 
                      v_R_System_5.ResourceID = v_GS_WORKSTATION_STATUS_5.ResourceID
WHERE     (v_GS_ADD_REMOVE_PROGRAMS_5.Publisher0 LIKE '%Adobe%') AND (v_GS_ADD_REMOVE_PROGRAMS_5.Version0 LIKE '7%') AND 
                      (v_GS_ADD_REMOVE_PROGRAMS_5.DisplayName0 LIKE '%Acrobat%Pro%') AND 
                      (NOT (v_GS_ADD_REMOVE_PROGRAMS_5.DisplayName0 LIKE '%Distiller%'))
4

1 回答 1

0

您可以使用 SQL 执行此操作 - 取决于您的方言和权限,可能通过编写用户定义的函数或通过另一种语言(例如,通过 C#/VB.NET 在 SQL Server 上的 CLR 程序集)。我不确定您的用例是什么,但是在我的一些 SQL 字符串操作案例中,用编译(或 JIT 编译)语言编写它会大大提高性能 -但是它会根据具体情况而有所不同,并且更容易开始使用纯 SQL 解决方案:

这是我在 SQL Server 2008R2 中拼凑的一个快速版本(虽然它应该在 2005 年工作):

create function dbo.fFuncName ( @in varchar(128) )
returns varchar(128)
as begin
    declare @out varchar(128)
    declare @i int
    declare @c char
    declare @len int
    declare @lastWasSpace bit
    set @out = ''
    set @i = 1
    set @len = len(@in)
    set @lastWasSpace = 1
    while @i <= @len begin
        set @c = substring(@in, @i, 1)
        set @i = @i + 1
        if @c >= '0' and @c <= '9' or @c = '.' continue
        if @c = ' ' and @lastWasSpace = 1 continue
        set @lastWasSpace = 0
        if @c = ' ' set @lastWasSpace = 1
        set @out = @out + @c
    end
    return rtrim(@out)
end

这将删除所有数字、句点和重复空格。你可以这样称呼它:

select dbo.fFuncName('Adobe Acrobat 9.0 Pro')

结果为Adobe Acrobat Pro

如果您需要提取版本号,您可以编写一个相反的函数——只保留数字和句点。

此外,由于您使用的是 SQL Server 2005,因此您可以使用 CLR 程序集。仅当您定期处理数千条记录时,这才真正值得。如果适用,请参见此处。

请注意,如果您没有足够的权限,这两种解决方案都不起作用——如果您所在的公司足够大,可以以策略驱动的方式将他们的报告编写者和 DBA 分开,那么您可能无法创建用户定义的函数,在在这种情况下,如果没有 DBA 的帮助,您的问题就会变得更加复杂。

于 2013-05-20T15:29:47.043 回答