2

我目前正在更新一个已经存在的 SSIS 包。当前包从我们的 IT 部门提供的 Excel 电子表格中提取数据。它列出了计算机的机器名称并将其计算为许可证报告。

我目前让 Job(派生列)从机器名称的第一部分去除 M(移动)或 D(桌面),以便它只返回用户名,这是我需要的报告。

MBRUBAKERBR => BRUBAKERBR

但是,我们的 IT 部门刚刚实施了 Windows 7,并采用了新的命名约定。现在有一个 76A、B、C 或 D 被添加到所有更新的机器的末尾。如果机器尚未更新,则它保留旧的命名约定(见上图)。

还有一些机器必须保留在 XP 上,它们的名称已更新为在它们的末尾有 X3A、B、C 或 D。

MBRUBAKERBR76A or DBRUBAKERX3C

我需要删除名称的最后一部分,以便从中获取用户名以进行报告。

问题是我不能使用 LEFT、RIGHT、LTRIM 或 RTRIM 表达式,因为某些计算机名称前面只会有 M 或 D(因为它们尚未升级)。

我能做些什么来删除这些字符而不重建这个包?

更新:我真的很想更新删除 M 和 D 的现有表达式。这是我正在使用的表达式。

SUBSTRING(Name,2,50) 

这是在我的 SSIS 包的派生列中。

至于样本数据,这里是它的样子。

|      Name      |
| MBrubakerBR76A |
| MBROCKSKX3A    |
| DGOLDBERGZA    |
| MWILLIAMSEL    |
| DEASTST76C     |
| DCUSICKEVX3D   |

这就是我希望它返回的内容。

|      Name      |
| BRUBAKERBR     |
| BROCKSK        |
| GOLDBERGZA     |
| WILLIAMSEL     |
| EASTST         |
| CUSICKEV       | 

如果您需要更多信息或示例,请告诉我。

4

1 回答 1

1

先判断机器是否已经升级,如果是则去掉最后3个和第一个字母。如果尚未升级,则只需删除第一个字母。我避免使用 Trim 函数来保持代码清晰。

SELECT
machineName,

CASE WHEN RIGHT(machineName, 3) Like '%[0-9]%' THEN
  SUBSTRING(machineName, 2, len(machineName) - 4)
ELSE 
  RIGHT(machineName, len(machineName)-1)
END AS UserName

From MachineList

SQL 小提琴示例

SSIS 表达式
由于模式匹配在 SSIS 表达式中不起作用,试试这个

LEFT(RIGHT(machineName, 3),2)="X3"||LEFT(RIGHT(machineName, 3),2)="76"?SUBSTRING(machineName, 2, len(machineName) - 4):RIGHT(machineName, len(machineName)-1)
于 2013-10-03T03:30:55.573 回答