SSIS使用DateTime输入参数执行SQL查询错误

时间:2011-03-29 08:49:10

标签: sql-server sql-server-2005 ssis

我花了几天时间试图解决这个问题。我有一个SSIS包,在序列容器中有2个执行SQL任务,一个是从表中的简单删除,下一个是插入前删除的简单插入。删除工作正常,所以连接等没问题。

插入失败时出现以下模糊且无用的消息。

failed with the following error: "Syntax error, permission violation, or other nonspecific error". Possible failure reasons: Problems with the query, "ResultSet" property not set correctly, parameters not set correctly, or connection not established correctly. 

insert具有1个输入参数,该参数是绑定到设置为01/01/2011的datetime变量的日期。当我更换?在具有硬编码日期的sql任务查询中,任务有效。我还在插入任务的预执行事件断点处查看了本地,并且变量没问题。

我还启动了一个SQL事件探查器会话,我看到删除查询命中了数据库但没有插入任何内容(当它使用输入参数时)。

我正在使用Visual Studio 2005 Pro SP1(不是我的选择)和SQL Server 2005 SP3。

此致

标记

3 个答案:

答案 0 :(得分:6)

我知道你找到了问题的答案。但是,我想在此澄清一下,您使用 OleDb 连接执行的以下查询是有效的,并且它在Execute SQL Task SSIS包中的INSERT INTO dbo.table1 (DateCol, OtherCol, OtherCol1) SELECT ?, SourceCol1, SourceCol2 FROM dbo.SourceTable 内有效。

Business Intelligence Development Studio (BIDS) 2005

以下示例显示使用 SSIS 2005 dbo.Source)成功实施上述查询

分步流程:

  1. 使用 Scripts 部分下提供的脚本创建两个名为dbo.Destinationdbo.Source的表。使用屏幕# 1 屏幕截图中显示的数据填充表格dbo.Destination。表Connections Managers最初将为空,并使用执行SQL任务填充源数据。

  2. 在SSIS包上,在Execute SQL Task中创建一个名为 SQLServer 的OLE DB连接,指向您首选的SQL Server实例。请参阅屏幕截图# 2

  3. 在SSIS包上,创建名为 RecordDate 的变量,如屏幕截图# 3 所示。

  4. 在SSIS包中,放置dbo.Source,如屏幕截图# 4 所示。配置任务,如屏幕截图# 5 和# 6 所示。

  5. 屏幕截图# 7 显示示例包执行。

  6. 屏幕截图# 8 会在程序包执行后显示表dbo.DestinationCREATE TABLE [dbo].[Destination]( [Id] [int] IDENTITY(1,1) NOT NULL, [DateValue] [datetime] NOT NULL, [ItemNumber] [varchar](50) NOT NULL, [Qty] [int] NOT NULL, CONSTRAINT [PK_Destination] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY] GO CREATE TABLE [dbo].[Source]( [Id] [int] IDENTITY(1,1) NOT NULL, [ItemNumber] [varchar](50) NOT NULL, [Qty] [int] NOT NULL, CONSTRAINT [PK_Source] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY] GO 中的数据。

  7. 希望有所帮助。

    <强>脚本:

    {{1}}

    屏幕截图#1:

    1

    屏幕截图#2:

    2

    屏幕截图#3:

    3

    屏幕截图#4:

    4

    屏幕截图#5:

    5

    屏幕截图#6:

    6

    屏幕截图#7:

    7

    屏幕截图#8:

    8

答案 1 :(得分:2)

您需要确保您的SQL语句的类型正确,以便根据您的连接管理器进行参数化。

如果您正在使用OLE DB - 您的Insert语句需要某种类似INSERT INTO Tbl(col) VALUES (?)

结果集应为“无”(因为INSERT上没有任何内容可返回),参数映射选项卡应该有一个参数(或者你有多少个参数,参数名称应该是(对于OLE DB)从0开始,然后是1,2 ......,n。如果您使用的是ADO连接,则必须将参数命名为Param1,Param2,... ParamN。

您可以在此处查看将变量传递到相应连接管理器的参考:http://technet.microsoft.com/en-us/library/cc280502.aspx

根据您的评论正确回答: 您不能在该类查询中使用参数映射。但是有一种简单的方法可以做到。

创建一个新变量sqlCommand(类型字符串)。在变量列表中单击它,然后按F4查看属性。将“EvaluateAsExpression”更改为true,然后单击表达式框以启动表达式窗口。在这里以您的"INSERT INTO tbl(dateCol,intCol,charCol) SELECT CONVERT(DATETIME,'" + (DT_STR,20,1252)@[User::dateVar] + "',104) AS dateCol, intCol, charCol from anotherTbl"

格式进行查询

单击“评估表达式”时,您将看到正在形成的可以使用的有效SQL语句。

现在返回执行SQL任务,删除参数映射。关闭对话框,单击执行SQL任务,按F4,找到表达式行,单击...并在属性“SqlStatementSource”上添加表达式@ [User :: sqlCommand](或任何您命名的变量) )。

现在运行任务,它应该没有问题。

答案 2 :(得分:0)

你可以在这里找到表达式: enter image description here