我创建了一个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