我花了几天时间试图解决这个问题。我有一个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。
此致
标记
答案 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
)成功实施上述查询
分步流程:
使用 Scripts 部分下提供的脚本创建两个名为dbo.Destination
和dbo.Source
的表。使用屏幕# 1 屏幕截图中显示的数据填充表格dbo.Destination
。表Connections Managers
最初将为空,并使用执行SQL任务填充源数据。
在SSIS包上,在Execute SQL Task
中创建一个名为 SQLServer 的OLE DB连接,指向您首选的SQL Server实例。请参阅屏幕截图# 2 。
在SSIS包上,创建名为 RecordDate 的变量,如屏幕截图# 3 所示。
在SSIS包中,放置dbo.Source
,如屏幕截图# 4 所示。配置任务,如屏幕截图# 5 和# 6 所示。
屏幕截图# 7 显示示例包执行。
屏幕截图# 8 会在程序包执行后显示表dbo.Destination
和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
中的数据。
希望有所帮助。
<强>脚本:强>
{{1}}
屏幕截图#1:
屏幕截图#2:
屏幕截图#3:
屏幕截图#4:
屏幕截图#5:
屏幕截图#6:
屏幕截图#7:
屏幕截图#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)
你可以在这里找到表达式: