2013-05-20 27 views
0

因此,我正在编写一个报告,将所有版本的Adobe Acrobat Pro拉入单个SQL报告中。我遇到的问题是,Adobe将其命名约定从版本更改为版本。某些显示“Adobe Acrobat 7.1.0 Professional”,而其他显示“Adobe Acrobat 9 Pro”。我的问题是我可以在另一列显示版本,但是可能只显示所有不同版本的“Adobe Acrobat Pro”,并解析出#号?从sql表中拉出特定的单词或短语

也请原谅我,我仍然是新的整个sql查询的东西。但是我做了很多挖掘,似乎找不到任何适合我的东西。通过写一个用户定义的函数或者通过SQL另一种语言(如CLR组件取决于你的方言和权限可能 -

在此先感谢

斯科特

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%')) 
+0

哪种SQL方言(例如SQL Server 2008R2)? – Kaganar

+0

sql server 2005 –

回答

0

你可以用SQL做到这一点服务器通过C#/ VB.NET)。我不确定你的用例是什么,但是在我的一些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程序集。如果您定期处理数千条记录,这只是非常值得的。如果适用,请参阅here

请注意,如果您没有足够的权限,那么这两种解决方案都无法正常工作 - 如果您所在的公司足够大,以政策驱动的方式将报告编写者和DBA分离出来,您可能无法创建用户在这种情况下,如果没有DBA的帮助,您的问题就会变得非常复杂。

+0

非常感谢!这正是我正在寻找的! –

相关问题