到目前为止,我一直在寻找从SSIS执行sp的可能解决方案,但任何事情似乎都有效。我有一个sp:
CREATE PROCEDURE [DBO].[SPIDENTIFIERS] @IDENT NVARCHAR(MAX) OUTPUT
我需要的是将结果保存在我在SSIS中创建的变量中。
这是我过去尝试过的配置。
在参数设置部分中,我还使用了Direction作为Output或ReturnValue但是我收到了一条错误消息。只是为了尝试我放一个脚本任务来判断价值,但正如你所看到的那样,这是空的。
使用Direction Ouput或ReturnValue,我得到了这个:
[Execute SQL Task] Error: Executing the query "EXECUTE spIdentifiers ? OUTPUT;" failed with the following error:
"El valor no está dentro del intervalo esperado.".
Possible failure reasons: Problems with the query, "ResultSet" property not set correctly,
parameters not set correctly, or connection not established correctly.
在任务配置中我缺少什么?
我在这篇文章中寻找答案。但似乎没有任何效果
How do you call a Stored Procedure in SSIS?
提前致谢。
答案 0 :(得分:2)
你的参数不应该被命名,正如@gerald Davis指出的那样。对于OLEDB类型的连接管理器,它应该是基于序数的,因此为0
这是我的示例包,你可以看到我的变量@[User::MyVariables]
填充了很多X
这是我的proc定义
IF NOT EXISTS
(
SELECT
*
FROM
sys.procedures AS P
WHERE
P.name = N'SPIDENTIFIERS'
)
BEGIN
EXECUTE sys.sp_executesql N'CREATE PROC dbo.spidentifiers AS SELECT ''stub version, to be replaced''';
END
GO
ALTER PROCEDURE [DBO].[SPIDENTIFIERS]
(
@IDENT NVARCHAR(MAX) OUTPUT
)
AS
BEGIN
SET NOCOUNT ON;
SET @IDENT = REPLICATE(CAST(N'X' AS nvarchar(MAX)), 4001);
-- Uncomment this to watch the fireworks
--SET @IDENT = REPLICATE(CAST(N'X' AS nvarchar(MAX)), 4001);
END
我非常喜欢使用商业智能标记语言Biml来描述我的解决方案,因为它允许读者重新创建我描述的解决方案而不需要点击那些麻烦的鼠标。
ConnectionString
以指向有效的服务器和数据库。我的引用是localhost \ dev2014和tempdb Biml代码如下
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
<Connections>
<OleDbConnection Name="tempdb" ConnectionString="Provider=SQLNCLI11.1;Server=localhost\dev2014;Initial Catalog=tempdb;Integrated Security=SSPI;" />
</Connections>
<Packages>
<Package Name="so_30460630" ConstraintMode="Linear">
<Variables>
<Variable DataType="String" Name="MyVariables">0</Variable>
</Variables>
<Tasks>
<ExecuteSQL
ConnectionName="tempdb"
Name="SQL Ensure Objects Exist">
<DirectInput>
<![CDATA[IF NOT EXISTS
(
SELECT
*
FROM
sys.procedures AS P
WHERE
P.name = N'SPIDENTIFIERS'
)
BEGIN
EXECUTE sys.sp_executesql N'CREATE PROC dbo.spidentifiers AS SELECT ''stub version, to be replaced''';
END
GO
ALTER PROCEDURE [DBO].[SPIDENTIFIERS]
(
@IDENT NVARCHAR(MAX) OUTPUT
)
AS
BEGIN
SET NOCOUNT ON;
SET @IDENT = REPLICATE(CAST(N'X' AS nvarchar(MAX)), 4001);
END
]]>
</DirectInput>
</ExecuteSQL>
<ExecuteSQL
ConnectionName="tempdb"
Name="SQL Using an OUTPUT parameter">
<DirectInput>EXECUTE dbo.SPIDENTIFIERS ? OUTPUT;</DirectInput>
<Parameters>
<Parameter DataType="String" VariableName="User.MyVariables" Name="0" Direction="Output" Length="-1" />
</Parameters>
</ExecuteSQL>
<ExecuteSQL
ConnectionName="tempdb"
Name="SQL Breakpoint">
<DirectInput>SELECT NULL AS nothing;</DirectInput>
</ExecuteSQL>
</Tasks>
</Package>
</Packages>
</Biml>
答案 1 :(得分:0)
答案 2 :(得分:0)
您的存储过程参数是OUTPUT,但您的SSIS包将其定义为INPUT。根据应用程序的不同,也可以使用RETURNVALUE,但是根据SP的语法,它使用输出参数而不是返回值。
验证User:Id变量是否具有正确的数据类型。尝试手动执行SSMS中的SP以验证它是否正常运行并返回预期结果。
我认为你正在混合OLEDB和ADO.NET语法。
如果使用OLEDB数据连接,那么你使用?查询中的参数和参数名称必须为“参数0 (和参数1,如果大于1,则等)”。 注意:参数名称为零索引。在SP中,如果参数超过1,则需要正确的顺序。
如果使用ADO.NET DataConnection ,则查询只是存储过程的命名,IsStoredProcedure = True,参数名称与SP中参数的名称匹配。
从截图中您当前使用的是命名参数和OLDEDB?句法。我不相信这是有效的。它取决于连接类型,是一种或另一种。
答案 3 :(得分:0)