2017-11-28 20 views
0

マージステートメントを使用してレコードを一括して挿入/更新しようとしました。しかし、私は次のエラーが発生しています。オンラインで検索しましたが、修正する方法が見つけられませんでした。私が間違っているところを教えてくれる人もいますか?マージ使用/更新を挿入する挿入/更新中にデータ型varcharを数値に変換中にエラーが発生しました

CREATE TYPE [Metric].[MetricGoalType3] AS TABLE 
(
    [metricGoalId] [int] NULL, 
    [lineOfBusinessConfigId] [int] NULL,  
    [metricIndicatorId] [int] NOT NULL, 
    [goalYearConfigId] [int] NOT NULL, 
    [goalPeriodConfigId] [int] NOT NULL, 
    [marketConfigId] [int] NOT NULL, 
    [targetValue] [decimal](20, 3) NULL, 
    [actualValue] [decimal](20, 3) NULL, 
    [metricGoalStatusConfigId] [int] NOT NULL, 
    [metricGoalStatusReasonConfigId] [int] NOT NULL, 
    [ownerId] [int] NULL, 
    [workerId] [int] NULL 
) 

ストアドプロシージャ:(/更新を挿入する必要がある唯一の列を持つタイプを作成)

Error converting data type varchar to numeric while inserting'

表構造

CREATE TABLE [Metric].[MetricGoal] 
(
    [metricGoalId] [int] IDENTITY(1,1) NOT NULL, 
    [profileConfigId] [int] NOT NULL, 
    [metricGoalName] [varchar](200) NULL, 
    [metricIndicatorId] [int] NOT NULL, 
    [marketConfigId] [int] NOT NULL, 
    [regionConfigId] [int] NOT NULL, 
    [goalYearConfigId] [int] NOT NULL, 
    [goalPeriodConfigId] [int] NOT NULL, 
    [targetValue] [decimal](20, 3) NULL, 
    [actualValue] [decimal](20, 3) NULL, 
    [metricGoalStatusConfigId] [int] NOT NULL, 
    [metricGoalStatusReasonConfigId] [int] NOT NULL, 
    [ownerId] [int] NULL, 
    [workerId] [int] NULL, 
    [createdOn] [datetime] NOT NULL, 
    [createdBy] [int] NOT NULL, 
    [updatedOn] [datetime] NOT NULL, 
    [updatedBy] [int] NOT NULL, 
    [lineOfBusinessConfigId] [int] NULL, 
    [productConfigId] [int] NULL, 
    [serviceAreaConfigId] [int] NULL, 
) 

ユーザー定義テーブル型:

CREATE PROCEDURE [Metric].[prMaintainMetricGoalBulkLoad] 
    @currUserId INT = NULL, 
    @currProfileConfigId INT = NULL, 
    @tblMetricGoal [Metric].[MetricGoalType3] READONLY 
AS 
    DECLARE @now DATETIME = GETDATE() 
BEGIN 
    SET NOCOUNT ON; 

    MERGE INTO [Metric].[MetricGoal] T 
    USING @tblMetricGoal S ON (T.metricGoalId = S.metricGoalId) 

    WHEN MATCHED 
     THEN UPDATE 
      SET T.targetValue = CASE WHEN S.targetValue = '' THEN NULL ELSE ISNULL(CONVERT(DECIMAL(20,3),NULLIF(S.targetValue,'')),T.targetValue) END, 
       T.actualValue = CASE WHEN S.actualValue = '' THEN NULL ELSE ISNULL(CONVERT(DECIMAL(20,3),NULLIF(S.actualValue,'')),T.actualValue) END, 
       T.metricGoalStatusConfigId = CASE WHEN S.metricGoalStatusConfigId = -1 THEN NULL ELSE ISNULL(S.metricGoalStatusConfigId,T.metricGoalStatusConfigId) END, 
       T.metricGoalStatusReasonConfigId = CASE WHEN S.metricGoalStatusReasonConfigId = -1 THEN NULL ELSE ISNULL(S.metricGoalStatusReasonConfigId,T.metricGoalStatusReasonConfigId) END, 
       T.ownerId = CASE WHEN S.ownerId = -1 THEN NULL ELSE ISNULL(S.ownerId,T.ownerId) END, 
       T.workerId = CASE WHEN S.workerId = -1 THEN NULL ELSE ISNULL(S.workerId,T.workerId) END, 
       T.updatedOn = @now, 
       T.updatedBy = @currUserId 

WHEN NOT MATCHED BY TARGET 
    THEN INSERT (profileConfigId, 
       --metricGoalName, 
       metricIndicatorId, lineOfBusinessConfigId, marketConfigId, 
       --productConfigId, 
       --serviceAreaConfigId, 
       --regionConfigId, 
       goalYearConfigId, goalPeriodConfigId, targetValue, actualValue, 
       metricGoalStatusConfigId, metricGoalStatusReasonConfigId, 
       ownerId, workerId, createdOn, createdBy, 
       updatedOn, updatedBy) 
     VALUES (@currProfileConfigId, 
       --S.metricGoalName, 
       S.metricIndicatorId, S.lineOfBusinessConfigId, S.marketConfigId, 
       --NULLIF(S.productConfigId,-1), 
       --NULLIF(S.serviceAreaConfigId,-1), 
       --S.regionConfigId, 
       S.goalYearConfigId, S.goalPeriodConfigId, 
       CONVERT(DECIMAL(20,3),NULLIF(S.targetValue,'')), 
       CONVERT(DECIMAL(20,3),NULLIF(S.actualValue,'')), 
       S.metricGoalStatusConfigId, S.metricGoalStatusReasonConfigId, 
       NULLIF(S.ownerId, -1), 
       NULLIF(S.workerId, -1), 
       @now, @currUserId, @now, @currUserId); 
END 

例ecution(文の下に取得するためにSQL Serverプロファイラを使用)

declare @p3 Metric.MetricGoalType3 
insert into @p3 values(820,819,4,602,570,694,39.000,43.000,655,660,1585,NULL) 
insert into @p3 values(NULL,819,4,602,570,1853,NULL,NULL,655,660,NULL,NULL) 

exec Metric.prMaintainMetricGoalBulkLoad @currUserId=1618,@currProfileConfigId=301,@[email protected] 
+0

'convert'や' cast'の代わりに 'try_convert'や' try_cast'を使用します。 –

答えて

1

これらの2行はエラーが含まれています。decimal sのstringであること

T.targetValue = CASE WHEN S.targetValue = '' THEN NULL ELSE ISNULL(CONVERT(DECIMAL(20,3),NULLIF(S.targetValue,'')),T.targetValue) END, 
T.actualValue = CASE WHEN S.actualValue = '' THEN NULL ELSE ISNULL(CONVERT(DECIMAL(20,3),NULLIF(S.actualValue,'')),T.actualValue) END, 

targetValueと実際の値の両方が進(20,3)ですので、どのように''を使用することができますか?

それも、それはセンスがないのが、少なくともそこVILL varcharからnumericへの変換になることはありませ

T.targetValue = CASE WHEN S.targetValue is null THEN NULL ELSE ISNULL(CONVERT(DECIMAL(20,3),NULLIF(S.targetValue,null)),T.targetValue) END, 
T.actualValue = CASE WHEN S.actualValue is null THEN NULL ELSE ISNULL(CONVERT(DECIMAL(20,3),NULLIF(S.actualValue,null)),T.actualValue) END, 

でなければなりません。ここで

はあなたのエラーは(私が代わりにテーブルの変数を使用します)を再生する方法である:

declare @StargetValue DECIMAL(20,3) = 10, @TtargetValue DECIMAL(20,3) = 20; 
set @ttargetValue = CASE WHEN @StargetValue = '' THEN NULL ELSE ISNULL(CONVERT(DECIMAL(20,3),NULLIF(@StargetValue,'')),@TtargetValue) END 

あなたが''とあなたの小数点に直面しよう''だけdecimalに変換することができないため、エラーが発生します。

+0

あなたは素晴らしいです。私はエラーが発生している場所を見つけましたが、それを修正する方法が見つからなかったので、今すぐです。おかげさまで – crony

0

あり正しく変換されないデータは、あるまさにかどこ私が言うことはできませんが、あなたは、SQL Server 2012のを使用している示しているので、その後TRY_CONVERTかを使用convertまたはcastの代わりにTRY_CASTです。

これらの2つの新しい関数は、データを変換できない場合は失敗しません。単純にNULLを返します。これは悪いデータを解決しないかもしれませんが、それは助けになります。たとえば、where句でこれらを使用できます。

select * 
from to_be_imported 
where try_convert(date,stringcolumn) IS NULL 
+0

私は試しました。しかし、私は同じエラーが発生しています – crony

+0

"私は試しました" ... *何?*あなたはwhere句でtry_castを使って問題を分離しようとしましたか?私はあなたがツールを供給することができることをすべて実現することを願っています。私はデータでハードヤードをしなければならないと恐れています。 –

0

ステートメントの挿入部分がテーブル定義と揃っていないようです。挿入リストの3番目のフィールドは、テーブルの3番目のフィールドに挿入しようとしているlineOfBusinessConfigId、varcharカラムのmetricGoalNameです。

関連する問題