0

So I'm writing a report that pulls all versions of adobe acrobat pro into a single sql report. The problem I'm coming across is that Adobe changes its naming convention from version to version. Some display 'Adobe Acrobat 7.1.0 Professional' while others display 'Adobe Acrobat 9 Pro'. My question is I can display the version in another column, but is it possible to only display 'Adobe Acrobat Pro' for all of the different versions and parse out the the #?

Also please forgive me, I'm still newish to the whole sql query thing. But I've done a lot of digging and cant seem to find anything that'll work for me.

Thanks in advance

Scott

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 に答える