【问题标题】:Evaluate excel sheet names with spaces in foreach loop in SSIS在SSIS的foreach循环中评估带有空格的excel工作表名称
【发布时间】:2019-03-31 11:42:09
【问题描述】:

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

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

由于某种原因,当工作表名称没有任何空格(例如 MyTab)时它可以正常工作,但是,当有空格时(例如 My Tab),它不能正确匹配。

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

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

有什么想法吗?

【问题讨论】:

标签: sql sql-server excel ssis etl


【解决方案1】:

非常感谢您的建议。

我将包剥离回来(在没有导入任何 excel 数据的情况下返回到循环中),并采纳了 Bogdan 将变量值输出到表中的建议。

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

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

【讨论】:

  • 干得好!我认为既然你接受了博格丹的建议,那么对他的回答投赞成票是件好事。如果他们有帮助,你也可以投票给其他人的答案
【解决方案2】:

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

另外,一个不错的方法是在从 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】:

    我认为您在订购 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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        • 1970-01-01
        相关资源
        最近更新 更多