【问题标题】:Check Excel file destination temp table in SSIS?检查SSIS中的Excel文件目标临时表?
【发布时间】:2013-05-24 12:10:14
【问题描述】:

我已经创建了 ssis 包来从 sql 表中动态生成 excel 文件。

但是,当我尝试在 sql 任务中使用以下查询检查该 excel 连接临时表是否存在时,它会出现语法错误

IF object_id(MyExcel) is not null

CREATE TABLE `MyExcel` (
    `CUSIP` varchar(50),
    `FaceAmount` decimal(18,4),
    `Portfolio` varchar(50),
    `PositionDate` DateTime,
    `PositionCost` decimal(18,6),
    `CurrentPrice` decimal(18,6)
)

else drop table MyExcel

错误:

[Execute SQL Task] Error: Executing the query "IF object_id(MyExcel) is not null

CREATE TABLE `..." failed with the following error: "Invalid SQL statement; expected 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT', or 'UPDATE'.". Possible failure reasons: Problems with the query, "ResultSet" property not set correctly, parameters not set correctly, or connection not established correctly.

请指教?

我已经尝试过回答

IF OBJECT_ID(N'MyExcel') IS NOT NULL
    BEGIN
        DROP TABLE MyExcel;
    END;

CREATE TABLE [MyExcel] 
(
    [CUSIP]         VARCHAR(50),
    [FaceAmount]    DECIMAL(18,4),
    [Portfolio]     VARCHAR(50),
    [PositionDate]  DATETIME,
    [PositionCost]  DECIMAL(18,6),
    [CurrentPrice]  DECIMAL(18,6)
);

但语句仍然出现相同的错误

 IF OBJECT_ID(N'MyExcel') IS NOT NULL
        BEGIN
            DROP TABLE MyExcel;
        END;

我在SQL TASK 中使用这个查询 连接类型为EXCEL

【问题讨论】:

  • 你必须在单引号内指定表名。
  • 你是指excel表格还是SQL表格?
  • 我们在excel destination中使用的Excel表格表格

标签: sql ssis


【解决方案1】:

这似乎是 SQL-Server 语法 (OBJECT_ID('ObjectName')) 和 MySQL 语法(对象名称的反引号)的组合。我假设您正在连接到 SQL-Server 数据库,因此您应该使用 [] 限定您的对象名称。例如

IF OBJECT_ID(N'MyExcel') IS NOT NULL
    BEGIN
        CREATE TABLE [MyExcel] 
        (
            [CUSIP]         VARCHAR(50),
            [FaceAmount]    DECIMAL(18,4),
            [Portfolio]     VARCHAR(50),
            [PositionDate]  DATETIME,
            [PositionCost]  DECIMAL(18,6),
            [CurrentPrice]  DECIMAL(18,6)
        );
    END;
ELSE
    BEGIN
        DROP TABLE MyExcel;
    END;

但是,我认为您的逻辑是有缺陷的,您的语句是说“如果表存在,则创建它,如果不删除它”,所以如果它已经存在,您将收到一个错误,说表已经存在,如果它不是那么你会得到一个错误,说你不能放弃它,因为它不存在。你真正想要的是:

IF OBJECT_ID(N'MyExcel') IS NULL
    BEGIN
        CREATE TABLE [MyExcel] 
        ....

但是,这仍然给你带来了一个问题,因为如果表在任务运行之前存在,那么它不会在之后,如果它之前不存在,那么它将被创建,这意味着表是否任务完成后是否存在取决于该表之前是否存在。我想你想做这样的事情:

IF OBJECT_ID(N'MyExcel') IS NULL
    BEGIN
        CREATE TABLE [MyExcel] 
        (
            [CUSIP]         VARCHAR(50),
            [FaceAmount]    DECIMAL(18,4),
            [Portfolio]     VARCHAR(50),
            [PositionDate]  DATETIME,
            [PositionCost]  DECIMAL(18,6),
            [CurrentPrice]  DECIMAL(18,6)
        );
    END;
ELSE
    BEGIN
        TRUNCATE TABLE [MyExcel];
        -- If you don't want to truncate the table and want it with
        -- it's previous data in just remove the entire `else` clause
    END;

或者

IF OBJECT_ID(N'MyExcel') IS NOT NULL
    BEGIN
        DROP TABLE MyExcel;
    END;

CREATE TABLE [MyExcel] 
(
    [CUSIP]         VARCHAR(50),
    [FaceAmount]    DECIMAL(18,4),
    [Portfolio]     VARCHAR(50),
    [PositionDate]  DATETIME,
    [PositionCost]  DECIMAL(18,6),
    [CurrentPrice]  DECIMAL(18,6)
);

即任务运行后,您将始终在数据库中有一个名为 MyExcel 的表,因此您知道当您进入 SSIS 包中的下一步时它会在那里。

附录

据我所知,您不能将IF 与 Excel 连接一起使用。有一篇文章here 介绍了从 excel 工作簿中查询元数据,以便您检查表是否存在。这可能是技术上正确的做法。

不过,我可以通过Execute SQL Task 使用以下 SQL 来创建解决方法:

DELETE  
FROM    MyExcel;

然后将另一个Execute SQL Task 添加到 On Error 事件处理程序以运行:

CREATE TABLE MyExcel 
(
    CUSIP         VARCHAR(50),
    FaceAmount    DECIMAL(18,4),
    Portfolio     VARCHAR(50),
    PositionDate  DATETIME,
    PositionCost  DECIMAL(18,6),
    CurrentPrice  DECIMAL(18,6)
);

所以如果表不存在,delete语句会抛出错误,从而触发create table语句。从而保证任务运行后表MyExcel肯定存在。

这些任务可以颠倒过来,结果是一样的

【讨论】:

  • 已更新问题图片请告知,IF 条件仍然出现相同错误:(
  • 在一种情况下,(如果 Object_ID...)您正在引用 SQL 语法。在后者中,语法(带有侧向单引号,语法是指创建一个空的Excel工作表。我认为您不能将两者结合起来。
【解决方案2】:

您不会使用 CREATE TABLE 创建 excel 文件。如果您将 excel 文件视为数据库,那么表格将是.. 工作表 :)。

要创建 Excel 文件,您需要 Excel 连接管理器。您需要将其指向模板文件一次,然后使用正确的表达式设置 excel 目标后,将创建该文件。如果它已经存在,您只需要重定向错误。

然后您使用 Execute Sql 创建所需结构的表(即工作表)。

【讨论】:

  • 嗨,我只使用 Excel 连接管理器,但为了映射,我们需要在 excel 目标编辑器中创建一个表
  • @ashuthinks 是的,我明白了。但是您不会通过 CREATE TABLE 创建 Excel 文件。您可以通过 CREATE TABLE 在现有的 excel 文件中创建一个包含所需列的工作表。
【解决方案3】:

您可以将执行 SQL 任务添加到控制流的末尾以删除包中的 Excel 表。这将使环境准备好再次处理包。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多