Sql server SSIS使用DateTime输入参数执行SQL查询错误
我花了几天时间试图解决这个问题。我有一个SSIS包,在一个序列容器中有两个执行SQL任务,一个是从表中简单删除,另一个是简单插入。删除在插入之前。删除工作正常,因此连接等正常 插入失败,出现以下模糊且没有帮助的消息Sql server SSIS使用DateTime输入参数执行SQL查询错误,sql-server,sql-server-2005,ssis,Sql Server,Sql Server 2005,Ssis,我花了几天时间试图解决这个问题。我有一个SSIS包,在一个序列容器中有两个执行SQL任务,一个是从表中简单删除,另一个是简单插入。删除在插入之前。删除工作正常,因此连接等正常 插入失败,出现以下模糊且没有帮助的消息 failed with the following error: "Syntax error, permission violation, or other nonspecific error". Possible failure reasons: Problems with the
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任务查询中,该任务工作。我还研究了insert任务上预执行事件断点处的局部变量,变量是ok的
我还启动了一个SQL Profiler会话,我看到delete查询命中DB,但insert没有命中(当它使用输入参数时)
我使用的是VisualStudio2005Pro SP1(不是我的选择)和SQLServer2005SP3
问候
标记您需要确保SQL语句的类型正确,以便根据您的连接管理器进行参数化 如果您使用的是OLE DB,那么Insert语句需要类似于
Insert INTO Tbl(col)值(?)
Resultset应该是“None”(因为插入时没有返回任何内容),Parameter Mapping选项卡应该有一个单独的参数(或者尽可能多的参数),并且参数名(对于OLE DB)应该从0开始,然后是1,2…,n。如果使用ADO连接,则必须将参数命名为Param1,Param2,…ParamN
您可以在此处看到将变量传递给各个连接管理器的参考:
根据您的评论正确回答:
您不能在此类查询中使用参数映射,但有一种简单的方法
创建一个新的变量sqlCommand(类型字符串)。在变量列表中单击它,然后按F4键查看属性。将“EvaluateExpression”更改为true,然后单击表达式框以打开表达式窗口。在这里,以如下格式进行查询:“INSERT INTO tbl(dateCol,intCol,charCol)选择CONVERT(DATETIME),”+(DT_STR,201252)@[User::dateVar]+“,104)作为另一个tbl的dateCol、intCol、charCol”
当您单击“计算表达式”时,您将看到一个有效的SQL语句正在形成,您可以使用它
现在返回执行SQL任务,删除参数映射。关闭对话框,单击执行SQL任务,按F4键,找到表达式行,单击…并在属性“SqlStatementSource”上添加一个表达式,表达式@[User::sqlCommand](或任何您命名的变量)
现在运行任务,它应该可以正常工作。您可以在这里找到表达式:
我知道您已经找到了问题的答案。但是,我想在这里澄清一下,您使用OleDb连接执行的以下查询是有效的,并且它在
SSIS
包中的Execute SQL Task
中起作用
INSERT INTO dbo.table1 (DateCol, OtherCol, OtherCol1)
SELECT ?, SourceCol1, SourceCol2 FROM dbo.SourceTable
以下示例显示了使用SSIS 2005成功实现上述查询的过程(BusinessIntelligenceDevelopmentStudio(BIDS)2005
)
逐步过程:
dbo.Source
和dbo.Destination
的表。使用屏幕截图所示的数据填充表dbo.Source
。表dbo.Destination
最初将为空,并将填充源代码使用执行SQL任务的数据连接管理器中创建名为SQLServer的OLE DB连接,指向您首选的SQL Server实例。请参阅屏幕截图2
执行SQL任务
,如屏幕截图#4所示。配置任务,如屏幕截图#5和#6所示dbo.Source
和dbo.Destination
中的数据SQL连接是OLE DB、ODBC还是其他什么?我使用的是OLE DB我的查询的形式是INSERT INTO Table1(DateCol、OtherCol、OtherCol1…)选择?、SourceCol1、SourceCol2….从sourceTable ResultSet为none且参数映射有一个项User::RecordDate、Input、DATE、0Thanks cairnz,当我将EvaluateExpression设置为true时,单击表达式不会发生任何情况,也没有表达式窗口。我正在使用Visual Studio 2005 SP1,因此重新访问并重新阅读了投票结果。是的,您是的,你可以这样做,但是我不推荐这样做,因为它隐藏了当你的项目留给其他人时很难找到的逻辑。通过在表达式中使用sql语句,你可以对其进行计算,sql任务清楚地说明这是一个动态sql。在其中的某个地方找到一个?会使事情变得混乱,imho。
CREATE 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