Оцените имена листов Excel с пробелами в цикле foreach в SSIS - PullRequest
3 голосов
/ 31 марта 2019

Я создал цикл foreach, который перебирает файлы Excel на листах внутри них.На основе имени листа выполняется одна из нескольких задач потока данных.

Это реализуется задачей выполнения SQL, которая проверяет переменную по значениям в таблице и возвращает значение, основанное на некоторыхусловия.

По какой-то причине он отлично работает, когда в имени листа нет пробелов (например, MyTab), однако, когда есть пробел (например, Моя вкладка), он не совпадает правильно.

Я попытался сравнить имя листа со следующими значениями в таблице БД.

  • Моя вкладка $
  • 'Моя вкладка $'
  • 'Моя вкладка' $
  • {'Моя вкладка $'}
  • [Моя вкладка $]
  • ['Моя вкладка $']
  • "Моя вкладка $"
  • Моя вкладка
  • MyTab $
  • (Моя вкладка $)
  • '' Моя вкладка $ ''
  • ['' Моя вкладка $ '']
  • Моя вкладка $ $

Однако ни один из них не сравнится с именем листа "Моя вкладка"

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 ]

1 голос
/ 02 апреля 2019

Большое спасибо за ваши предложения.

Я удалил пакет обратно (в циклы без какого-либо импорта данных Excel) и принял предложение Богдана о выводе значений переменных в таблицу.

Интересно, что пакет срабатывал на переменные с пробелами.Затем я снял знак доллара, что не имело никакого значения.Наконец, я удалил одинарные кавычки, и это устранило проблему.Вот преобразование, которое я использовал:

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

0 голосов
/ 31 марта 2019

Вы пытались вывести переменную, которая содержит имена листов, в какую-нибудь таблицу / файл?Таким образом, таким образом вы можете увидеть значения, полученные в результате.

Кроме того, хорошим способом было бы очистить имена листов после чтения из файла 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);
0 голосов
/ 01 апреля 2019

Используйте квадратные скобки, но без $ или кавычек в названии листа.Это будет [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
0 голосов
/ 31 марта 2019

Я думаю, что у вас проблема с упорядочением 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.

...