0

我创建了 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 Connection 类型中使用这个查询是EXCEL 在此处输入图像描述

4

3 回答 3

4

这似乎是 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 包中的下一步时它会在那里。

附录

据我所知,您不能使用IFexcel 连接。这里有一篇关于从 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肯定存在。

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

于 2013-05-24T12:33:01.890 回答
0

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

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

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

于 2013-05-24T16:23:18.377 回答
0

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

于 2015-08-13T23:50:32.523 回答