2017-05-02 144 views
0

クエリから選択された3つのパラメータを入力するストアドプロシージャを実行しようとしています。最初の2つのストアドプロシージャのパラメータはintまたはbigintとなっていますが、sqlはそれを受け入れず、型nvarcharをbigintに変換できないことを伝えます。ストアドプロシージャの実行時に "データ型nvarcharをbigintに変換中にエラーが発生しました"

パラメータタイプをnvarcharに変更しましたが、ストアドプロシージャ内でクエリを実行するときにこのエラーが発生するようになりました。 nvarcharbigintに変換しようとしましたが、パラメータ値が数値であっても機能しません。ここで

は、私は、ストアドプロシージャを実行しています方法は次のとおりです。

[dbo].[InsertMultiChoiceList] [PatientRiskAssessmentQuestionsID], NetworkRiskAssessmentQuestionsID, Answer 

パラメータはこれらのような表情に渡される:

230124| 118 |COPD (Chronic Obstructive Pulmonary Disease), Congestive Heart Failure (CHF), Sleep Apnea 

ここに私のストアドプロシージャの定義:

ALTER PROCEDURE [dbo].[InsertMultiChoiceList] 
    @PatientRiskAssessmentQuestionsID nvarchar(100), 
    @NetworkRiskAssessmentQuestionsID nvarchar(100), 
    @answer varchar(max) 
AS 
BEGIN 
    DECLARE @XML AS XML 
    DECLARE @Delimiter AS CHAR(1) =',' 

    SET @XML = CAST(('<X>'+REPLACE(@answer , @Delimiter ,'</X><X>')+'</X>') AS XML) 

    DECLARE @temp TABLE (Answer Varchar(max)) 

    INSERT INTO @temp 
     SELECT N.value('.', 'Varchar(max)') AS Answer 
     FROM @XML.nodes('X') AS T(N) 

    INSERT INTO [dbo].[PatientRiskAssessmentQuestionsList](NetworkRiskAssessmentListID, PatientRiskAssessmentQuestionsID) 
     SELECT 
      [dbo].[fnc_GetNetworkRiskAssessmentList](LTRIM(RTRIM(q.Answer)), @NetworkRiskAssessmentQuestionsID, 'List') AS NetworkRiskAssessmentListID, 
      @PatientRiskAssessmentQuestionsID 
     FROM 
      (SELECT Answer FROM @temp) q 
     WHERE 
      NOT EXISTS (SELECT 1 
         FROM PatientRiskAssessmentQuestionsList x 
         WHERE x.NetworkRiskAssessmentListID = NetworkRiskAssessmentListID 
          AND x.PatientRiskAssessmentQuestionsID = @PatientRiskAssessmentQuestionsID); 
END 

PatientRiskAssessmentQuestionsListテーブルの構造は次のとおりです

enter image description here

は、ここでの問題は、あなたが実際にBIGINTは、このようにSQLが変換を許可しないで列NetworkRiskAssessmentListIDに文字列値をプッシュしようとしているあるfnc_GetNetworkRiskAssessmentList

ALTER function [dbo].[fnc_GetNetworkRiskAssessmentList] 
    (@text varchar(max), 
    @networkriskquestionid bigint, 
    @type varchar(20) 
    ) 
RETURNS BIGINT 
AS 
BEGIN 
    declare @id bigint 
    declare @questionid bigint 
    declare @count int 

    set @id = null 
    set @questionid = null 
    set @count = 0 

    if(@type = 'List') 
    begin 
     select @count = Count(*) 
     from NetworkRiskAssessmentList mc 
     where mc.Answer = @text 
      and mc.NetworkRiskAssessmentQuestionsID = @networkriskquestionid 

     if @count > 0 
     begin 
      select top(1) @questionid = mc.NetworkRiskAssessmentListID 
      from NetworkRiskAssessmentList mc 
      where mc.Answer = @text 
       and mc.NetworkRiskAssessmentQuestionsID = @networkriskquestionid 

      set @id = @questionid 
     end 
    end 

    return @questionid 
end 
+0

[PatientRiskAssessmentQuestionsList]テーブルの構造は何ですか? –

+0

すべての比較文を確認してください。誰でもあなたは 'BIGINT'と' NVARCHAR'を比較していますか? – Squirrel

+0

@Squirrelいいえスクリプトには比較文がありません。 bigintにストアドプロシージャのパラメータタイプを変更しても、エラー\ –

答えて

0

ためのスクリプトです。あなた

CREATE TABLE #Test 
(
Patient BIGINT, 
Network BIGINT 
) 

GO 

DECLARE @Patient NVARCHAR(100) 
DECLARE @Network NVARCHAR(100) 

SET @Patient = '1234' 
SET @Network = 'List' 

INSERT INTO #Test VALUES (@Patient,@Network) 

は、この情報がお役に立てば幸い問題を表示するだけのサンプルコード

は、テーブルのデータ型を変更してみてください、それを試してみます。

0

多分あなたのデータは非常に下記のようなコードを使用する文字またはタブ文字を入力しています

DECLARE @XML AS XML 

     DECLARE @Delimiter AS CHAR(1) =',' 

     SET @XML = CAST(('<X>'+REPLACE(@answer , @Delimiter ,'</X><X>')+'</X>') AS XML) 

     DECLARE @temp TABLE (Answer Varchar(max)) 

     INSERT INTO @temp 
     SELECT N.value('.', 'Varchar(max)') AS Answer FROM @XML.nodes('X') AS T(N) 

     insert into [dbo].[PatientRiskAssessmentQuestionsList](NetworkRiskAssessmentListID, PatientRiskAssessmentQuestionsID) 
     select 
     [dbo].[fnc_GetNetworkRiskAssessmentList](LTRIM(RTRIM(q.Answer)), @NetworkRiskAssessmentQuestionsID, 'List') as NetworkRiskAssessmentListID, 
     @PatientRiskAssessmentQuestionsID 
     from 
     (select cast(replace(replace(Answer, char(13), ''), char(10), '') as bigint) as Answer from @temp) q 
     where not exists 
     (
     select 1 from PatientRiskAssessmentQuestionsList x 
     where x.NetworkRiskAssessmentListID = NetworkRiskAssessmentListID and x.PatientRiskAssessmentQuestionsID = @PatientRiskAssessmentQuestionsID 
     ); 
0

あなたは次にあなたが次のコードで

を、それを使用している @PatientRiskAssessmentQuestionsID nvarchar(100)パラメータ

PatientRiskAssessmentQuestionsID値を渡しています

AND条件の問題ですので、

and x.PatientRiskAssessmentQuestionsID = 'PatientRiskAssessmentQuestionsID' 

x.PatientRiskAssessmentQuestionsIDはbigint

あると@PatientRiskAssessmentQuestionsIDは、その値が [PatientRiskAssessmentQuestionsID]

ので、これを修正し、すべてがOKになりますnvarchar (100)

です。

+0

nvarcharをbigint型に変換できないため、どのように比較するのですか。 –

関連する問題