在 SSIS 的 foreach 循环中使用空格计算 Excel 工作表名称



我创建了一个foreach循环,该循环遍历Excel文件中的工作表。根据工作表的名称,执行许多数据流任务之一。

这是由执行 SQL 任务实现的,该任务根据表中的值验证变量,并根据某些条件返回值。

出于某种原因,当工作表名称没有任何空格(例如MyTab)时,它可以正常工作,但是,当有空格(例如我的选项卡)时,它无法正确匹配。

我尝试根据数据库表中的以下值评估工作表名称。

  • 我的标签$
  • "我的标签$">
  • '
  • 我的标签'$
  • {'My Tab$'}
  • [我的标签$]
  • ["我的标签$"]
  • "我的标签$">
  • 我的标签页
  • 我的标签$
  • (我的标签$)
  • "我的标签$">
  • ["我的标签$"]
  • 我的$标签$

但是,这些都不会根据工作表名称"我的选项卡"进行评估

我用来计算变量的 SQL 是:

DECLARE @SheetName VARCHAR(100)
SET @SheetName = 'Tab1$'
IF EXISTS (SELECT 1
FROM    [dbo].[xx]
WHERE   sheetname = @SheetName)
-- The variable evaluates against the values in the sheetname column
BEGIN
SELECT 1 AS SheetExistsFlg
END
ELSE IF EXISTS (SELECT 1
FROM    [dbo].[xx]
WHERE   'Tab 2$' = @SheetName)
BEGIN
SELECT 2 AS SheetExistsFlg
END
ELSE
BEGIN
SELECT 0 AS SheetExistsFlg
END

有什么想法吗?

非常感谢您的建议。

我将包剥离回去(到循环中,没有任何 excel 数据导入),并接受了 Bogdan 的建议,将变量值输出到表中。

有趣的是,包在带有空格的变量上绊倒了。然后我把美元标志去掉了,这没有任何区别。所以最后我去掉了单引号,这解决了问题。这是我使用的转换:

(DT_WSTR,50)REPLACE(REPLACE(@[User::SheetName],"$",""),"'","")

您是否尝试过将保存工作表名称的变量输出到某个表/文件中? 因此,通过这种方式,您可以看到输出的值。

此外,一个不错的方法是在从 excel 文件中读取后清理工作表名称,这样当您设置条件时,您不会被美元符号或引号弄脏。

例如(只是复制粘贴了一些C#代码,希望对您有所帮助):

if (sheetName.EndsWith("$"))
Output0Buffer.FriendlySheetName = sheetName.Remove(sheetName.Length - 1);
if ((sheetName.StartsWith("'")) && (sheetName.EndsWith("$'")))
Output0Buffer.FriendlySheetName = sheetName.Substring(1, sheetName.Length - 3);

我认为您在订购IF时遇到问题...否则如果...否则语句。尝试使用以下语法:

DECLARE @SheetName VARCHAR(100)
SET @SheetName = 'Tab1$'
IF EXISTS (SELECT 1
FROM    [dbo].[xx]
WHERE   sheetname = @SheetName)
-- The variable evaluates against the values in the sheetname column
SELECT 1 AS SheetExistsFlg
ELSE 
BEGIN
IF 'Tab 2$' = @SheetName
SELECT 2 AS SheetExistsFlg
ELSE
SELECT 0 AS SheetExistsFlg
END

旁注:工作表名称以$符号结尾,那么您不必添加诸如[''My Tab$'']{'My Tab$'}等值。确保工作表名称仅包含一个空格,而不是多个空格或Tab

使用方括号,但在工作表名称中不带$或引号。 这将[My Tab]在代码上方发布的示例或代码中的[Tab 2]

DECLARE @SheetName VARCHAR(100)
SET @SheetName = 'Tab1$'
IF EXISTS (SELECT 1
FROM    [dbo].[xx]
WHERE   sheetname = @SheetName)
-- The variable evaluates against the values in the sheetname column
BEGIN
SELECT 1 AS SheetExistsFlg
END
ELSE IF EXISTS (SELECT 1
FROM    [dbo].[xx]
WHERE   '[Tab 2]' = @SheetName)
BEGIN
SELECT 2 AS SheetExistsFlg
END
ELSE
BEGIN
SELECT 0 AS SheetExistsFlg
END

最新更新