通过数据源中带有参数的过程,使用 SQL Server 2008 SSIS 数据流从 SQL Server 2005 检索数据
Retrieve data from SQL Server 2005 with SQL Server 2008 SSIS Data Flow via procedure with parameter in data source
我试图从 SQL Server 2005 上的过程中检索数据并在 SQL Server 2008 上填充 table。数据包在 SQL Server 2008 上。我有一个 SQL 任务用来获取日期。结果集被设置为一个名为 MeasurementPeriodid
的变量,一个 int32 数据类型。在我的 OLEDB 源数据流中,我有 SQL 命令:exec [dbo].[MIS_usp_Core_Fill_Arranegement] ?
。在“参数”选项卡上,@MSR_PRD_ID
映射到 User::MeasurementPeriodid
.
程序接受 MSR_PRD_ID INT。在过程中,结果集从 table 变量返回。此 table 中的列对应于目标中的列(并且是日期数据类型),是日期时间数据类型。
当我尝试预览时出现此错误:
Error at Arrangement [OLE DB Source 1]: SSIS Error Code
DTS_E_OLEDBERROR. An OLE DB error has occurred. Error code:
0x80004005. An OLE DB record is available. Source: "Microsoft SQL
Server Native Client 10.0" Hresult: 0x80004005 Description:
"Conversion failed when converting datetime from character string.".
Error at Arrangement [OLE DB Source 1]: Unable to retrieve column
information from the data source. Make sure your target table in the
database is available.
(微软Visual Studio)
当我从 SSMS 执行程序时,它工作正常。我试图注释掉查询中的日期时间列,该查询 returns 来自过程中 table 变量的结果集,但错误是相同的。
程序(不是全部,只是开始和结束):
ALTER PROCEDURE [dbo].[MIS_usp_Core_Fill_Arranegement]
@MSR_PRD_ID INT
AS
/**
TestSQL:
EXEC [dbo].[MIS_usp_Core_Fill_Arranegement] @MSR_PRD_ID = 20160831
**/
BEGIN
DECLARE @lclval nvarchar(20),
@datum varchar(15),
@imalacid int
SET NOCOUNT ON;
SET FMTONLY OFF;
DECLARE @Arrangement TABLE
(
[MeasurementPeriodId] datetime,
[ArrangementId] bigint,
[ArrangementUniqueId] nvarchar(100),
[CustomerId] bigint,
[CustomerUniqueId] nvarchar(100),
[ArrangementProductId] int, -- MAPIRANJE
[OrganizationUnitId] bigint,
[OrganizationUnitUniqueId] [nvarchar](100),
[NonPerformingLoanFlag] bit,
[ActivationDate] datetime,
[ArrangementTypeUniqueId] nvarchar(100),
[LastRenewalDate] datetime,
[NumberOfIssues] int, -- BROJ IZDATIH KARTICA
[ExpirationDate] datetime, -- EST_END_DT
[CancelationDate] datetime, -- END_DT
[CurrencyId] int,
[CurrencyTypeId] int,
[TermTypeId] int
)
select --[MeasurementPeriodId],
[ArrangementId],
[ArrangementUniqueId],
[CustomerId],
[CustomerUniqueId],
[ArrangementProductId], -- MAPIRANJE
[OrganizationUnitId],
[OrganizationUnitUniqueId],
[NonPerformingLoanFlag],
--[ActivationDate],
[ArrangementTypeUniqueId],
--[LastRenewalDate],
[NumberOfIssues], -- BROJ IZDATIH KARTICA
--[ExpirationDate], -- EST_END_DT
--[CancelationDate], -- END_DT
[CurrencyId],
[CurrencyTypeId],
[TermTypeId]
from @Arrangement
如果您修改存储过程以在 BEGIN
之后添加以下空操作,SSIS 是否可以很好地与存储过程一起使用?
IF (NULL = NULL)
BEGIN
SELECT
CAST(NULL AS datetime) AS [MeasurementPeriodId]
, CAST(NULL AS bigint) AS [ArrangementId]
, CAST(NULL AS nvarchar(100)) AS [ArrangementUniqueId]
, CAST(NULL AS bigint) AS [CustomerId]
, CAST(NULL AS nvarchar(100)) AS [CustomerUniqueId]
, CAST(NULL AS int) AS [ArrangementProductId]
, CAST(NULL AS bigint) AS [OrganizationUnitId]
, CAST(NULL AS [nvarchar](100)) AS [OrganizationUnitUniqueId]
, CAST(NULL AS bit) AS [NonPerformingLoanFlag]
, CAST(NULL AS datetime) AS [ActivationDate]
, CAST(NULL AS nvarchar(100)) AS [ArrangementTypeUniqueId]
, CAST(NULL AS datetime) AS [LastRenewalDate]
, CAST(NULL AS int) AS [NumberOfIssues]
, CAST(NULL AS datetime) AS [ExpirationDate]
, CAST(NULL AS datetime) AS [CancelationDate]
, CAST(NULL AS int) AS [CurrencyId]
, CAST(NULL AS int) AS [CurrencyTypeId]
, CAST(NULL AS int) AS [TermTypeId];
END
如果是这样,根本问题是 SSIS 无法确定输出的结构 table,因为它是一个临时对象。上面的 hack 是 2005/2008 向 SSIS 引擎提供元数据外观提示的方式。
我试图从 SQL Server 2005 上的过程中检索数据并在 SQL Server 2008 上填充 table。数据包在 SQL Server 2008 上。我有一个 SQL 任务用来获取日期。结果集被设置为一个名为 MeasurementPeriodid
的变量,一个 int32 数据类型。在我的 OLEDB 源数据流中,我有 SQL 命令:exec [dbo].[MIS_usp_Core_Fill_Arranegement] ?
。在“参数”选项卡上,@MSR_PRD_ID
映射到 User::MeasurementPeriodid
.
程序接受 MSR_PRD_ID INT。在过程中,结果集从 table 变量返回。此 table 中的列对应于目标中的列(并且是日期数据类型),是日期时间数据类型。
当我尝试预览时出现此错误:
Error at Arrangement [OLE DB Source 1]: SSIS Error Code DTS_E_OLEDBERROR. An OLE DB error has occurred. Error code: 0x80004005. An OLE DB record is available. Source: "Microsoft SQL Server Native Client 10.0" Hresult: 0x80004005 Description: "Conversion failed when converting datetime from character string.".
Error at Arrangement [OLE DB Source 1]: Unable to retrieve column information from the data source. Make sure your target table in the database is available.
(微软Visual Studio)
当我从 SSMS 执行程序时,它工作正常。我试图注释掉查询中的日期时间列,该查询 returns 来自过程中 table 变量的结果集,但错误是相同的。
程序(不是全部,只是开始和结束):
ALTER PROCEDURE [dbo].[MIS_usp_Core_Fill_Arranegement]
@MSR_PRD_ID INT
AS
/**
TestSQL:
EXEC [dbo].[MIS_usp_Core_Fill_Arranegement] @MSR_PRD_ID = 20160831
**/
BEGIN
DECLARE @lclval nvarchar(20),
@datum varchar(15),
@imalacid int
SET NOCOUNT ON;
SET FMTONLY OFF;
DECLARE @Arrangement TABLE
(
[MeasurementPeriodId] datetime,
[ArrangementId] bigint,
[ArrangementUniqueId] nvarchar(100),
[CustomerId] bigint,
[CustomerUniqueId] nvarchar(100),
[ArrangementProductId] int, -- MAPIRANJE
[OrganizationUnitId] bigint,
[OrganizationUnitUniqueId] [nvarchar](100),
[NonPerformingLoanFlag] bit,
[ActivationDate] datetime,
[ArrangementTypeUniqueId] nvarchar(100),
[LastRenewalDate] datetime,
[NumberOfIssues] int, -- BROJ IZDATIH KARTICA
[ExpirationDate] datetime, -- EST_END_DT
[CancelationDate] datetime, -- END_DT
[CurrencyId] int,
[CurrencyTypeId] int,
[TermTypeId] int
)
select --[MeasurementPeriodId],
[ArrangementId],
[ArrangementUniqueId],
[CustomerId],
[CustomerUniqueId],
[ArrangementProductId], -- MAPIRANJE
[OrganizationUnitId],
[OrganizationUnitUniqueId],
[NonPerformingLoanFlag],
--[ActivationDate],
[ArrangementTypeUniqueId],
--[LastRenewalDate],
[NumberOfIssues], -- BROJ IZDATIH KARTICA
--[ExpirationDate], -- EST_END_DT
--[CancelationDate], -- END_DT
[CurrencyId],
[CurrencyTypeId],
[TermTypeId]
from @Arrangement
如果您修改存储过程以在 BEGIN
之后添加以下空操作,SSIS 是否可以很好地与存储过程一起使用?
IF (NULL = NULL)
BEGIN
SELECT
CAST(NULL AS datetime) AS [MeasurementPeriodId]
, CAST(NULL AS bigint) AS [ArrangementId]
, CAST(NULL AS nvarchar(100)) AS [ArrangementUniqueId]
, CAST(NULL AS bigint) AS [CustomerId]
, CAST(NULL AS nvarchar(100)) AS [CustomerUniqueId]
, CAST(NULL AS int) AS [ArrangementProductId]
, CAST(NULL AS bigint) AS [OrganizationUnitId]
, CAST(NULL AS [nvarchar](100)) AS [OrganizationUnitUniqueId]
, CAST(NULL AS bit) AS [NonPerformingLoanFlag]
, CAST(NULL AS datetime) AS [ActivationDate]
, CAST(NULL AS nvarchar(100)) AS [ArrangementTypeUniqueId]
, CAST(NULL AS datetime) AS [LastRenewalDate]
, CAST(NULL AS int) AS [NumberOfIssues]
, CAST(NULL AS datetime) AS [ExpirationDate]
, CAST(NULL AS datetime) AS [CancelationDate]
, CAST(NULL AS int) AS [CurrencyId]
, CAST(NULL AS int) AS [CurrencyTypeId]
, CAST(NULL AS int) AS [TermTypeId];
END
如果是这样,根本问题是 SSIS 无法确定输出的结构 table,因为它是一个临时对象。上面的 hack 是 2005/2008 向 SSIS 引擎提供元数据外观提示的方式。