현재 C#에서 손상된 데이터베이스를 쿼리하려고합니다. 최근에 소개 된 오류는 특정 방식으로 데이터를 입력 할 때 열의 값이 기본값 0으로 설정되어 사용자가 수행하는 작업이나 dba가 수행하는 작업을 제어 할 수 없기 때문에 문제가되는 오류입니다.여러 행 쿼리에 대한 열 선택
이 문제를 해결하기 위해 사용자에게 출력해야하는 데이터에 대한 다른 경로를 발견했습니다. 문제는 열이 0이 아닌 숫자로 표시 될 때 이전 방법을 지원하는 감독자의 요구 사항이 있다는 것입니다.
케이스 또는 if 명령을 사용하여이 작업을 수행하려고하지만 SQL을 사용하면 좋지 않으므로 어디서 잘못되거나 제대로 처리 할 것인지 100 % 확신하지 못합니다.
SqlCommand caseCmd = new SqlCommand(
"SELECT H.CREATED, H.STATUSCODE, H.DETAILS, H.YEAR, H.MONTH, H.DAY, H.ITEMTEXT, TC.DOCLE, TC.ICPC, TC.ICD10, TERMCODE =" +
" CASE H.ITEMCODE WHEN 0" +
" THEN TN.TERMID" +
" ELSE H.ITEMCODE END" +
" FROM " + _databaseName + ".dbo.PASTHISTORY H" +
" INNER JOIN " + _drugDatabaseName + ".dbo.TERMNAMES TN ON TN.TERMNAME = H.ITEMTEXT" +
" INNER JOIN " + _drugDatabaseName + ".dbo.TERMCODES TC ON TC.TERMID = TERMCODE" +
" INNER JOIN " + _drugDatabaseName + ".dbo.CONDITIONS C ON C.TERMID = TERMCODE" +
" WHERE H.INTERNALID = @patientid" +
" AND H.RECORDSTATUS = 1" +
" AND ((H.CREATED >= @mindate) OR ((H.UPDATED IS NOT NULL) AND (H.UPDATED >= @mindate)))" +
" AND TC.RECORDSTATUS = 1",
Connection);
caseCmd.Parameters.AddWithValue("@patientid", int.Parse(patientId));
caseCmd.Parameters.AddWithValue("@mindate", minEnteredDate);
// Current error:
// When using 'TC.TERMID = TERMCODE', I get the error 'The conversion of the varchar value
// "3951000119103 " overflowed an int column'.
// This is alleviated by using either TN.TERMID OR H.ITEMCODE
SqlCommand ifCmd = new SqlCommand(
"IF (H.ITEMCODE = 0)" +
" SELECT H.CREATED, H.STATUSCODE, H.DETAILS, H.YEAR, H.MONTH, H.DAY, H.ITEMTEXT, TC.DOCLE, TC.ICPC, TC.ICD10, TN.TERMID" +
" FROM " + _databaseName + ".dbo.PASTHISTORY H" +
" INNER JOIN " + _drugDatabaseName + ".dbo.TERMNAMES TN ON TN.TERMNAME = H.ITEMTEXT" +
" INNER JOIN " + _drugDatabaseName + ".dbo.TERMCODES TC ON TC.TERMID = TN.TERMID" +
" INNER JOIN " + _drugDatabaseName + ".dbo.CONDITIONS C ON C.TERMID = TN.TERMID" +
" WHERE H.INTERNALID = @patientid" +
" AND H.RECORDSTATUS = 1" +
" AND ((H.CREATED >= @mindate) OR ((H.UPDATED IS NOT NULL) AND (H.UPDATED >= @mindate)))" +
" AND TC.RECORDSTATUS = 1" +
" ELSE IF (H.ITEMCODE <> 0)" +
" SELECT H.CREATED, H.STATUSCODE, H.DETAILS, H.YEAR, H.MONTH, H.DAY, H.ITEMTEXT, H.ITEMCODE, TC.DOCLE, TC.ICPC, TC.ICD10" +
" FROM " + _databaseName + ".dbo.PASTHISTORY H" +
" INNER JOIN " + _drugDatabaseName + ".dbo.TERMCODES TC ON TC.TERMID = H.ITEMCODE" +
" INNER JOIN " + _drugDatabaseName + ".dbo.CONDITIONS C ON C.TERMID = H.ITEMCODE" +
" WHERE H.INTERNALID = @patientid" +
" AND H.RECORDSTATUS = 1" +
" AND ((H.CREATED >= @mindate) OR ((H.UPDATED IS NOT NULL) AND (H.UPDATED >= @mindate)))" +
" AND TC.RECORDSTATUS = 1",
Connection);
ifCmd.Parameters.AddWithValue("@patientid", int.Parse(patientId));
ifCmd.Parameters.AddWithValue("@mindate", minEnteredDate);
// Current error:
// Getting two lines both saying 'The multi-part identifier "H.ITEMCODE" could not be bound.'
// I trust this is because of the IF and ELSE IF statements.
// Starting to think IF isn't the answer for me.
// Use either
SqlDataReader rdr = caseCmd.ExecuteReader();
// or
// SqlDataReader rdr = ifCmd.ExecuteReader();
이 심지어 원격으로 가능 아니면 그냥 둘 다 대안을 두 개의 SQL 명령을하고 그들 모두를 검색에 표시되어야합니다 다음은 현재 상태의 명령입니까?
처음에는 C# 코드에서 SQL 문을 만드는 것을 중단하는 것이 좋습니다. 저장 프로 시저를 사용하는 경우 더 좋을 것입니다. –
이 쿼리가 실행되는 SQL Server입니까? –
어쨌든 (감사합니다) 질문에 답변 한 것처럼 보입니다. SQL Server에서 절대적으로 실행됩니다. – Crimthann