在SSIS中的foreach循环中使用空格评估excel工作表名称

时间:2019-03-31 11:42:09

标签: sql sql-server excel ssis etl

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

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

由于某种原因,当工作表名称中没有空格(例如MyTab)时,它可以正常工作;但是,当有空格(例如“我的标签页”)时,它不能正确匹配。

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

  • 我的标签$
  • “我的标签$”
  • “我的标签” $
  • {'My Tab $'}
  • [我的标签$]
  • ['我的标签$']
  • “我的标签$”
  • 我的标签页
  • MyTab $
  • (我的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

有什么想法吗?

4 个答案:

答案 0 :(得分:1)

非常感谢您的建议。

我剥离了包装(不导入任何excel数据的循环),并采纳了Bogdan的建议,将变量值输出到表中。

有趣的是,程序包在带空格的变量上跳了起来。然后我剥去了美元符号,这没有任何区别。所以最后我删除了单引号,这解决了问题。这是我使用的转换:

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

您是否尝试过将保存工作表名称的变量输出到某个表/文件? 这样,您就可以看到输出的值。

此外,一种不错的方法是从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);

答案 3 :(得分:0)

使用方括号,但工作表名称中不包含$或引号。在代码上方发布的示例中为[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