На данный момент я пытаюсь запросить сломанную базу данных в C#. Недавно введенная ошибка заключается в том, что когда данные вводятся определенным образом, значение в столбце по умолчанию равно 0, что для меня проблематично, так как я не могу контролировать, что делает пользователь или что делает dba.Выбор столбца для нескольких запросов строк
Чтобы обойти это, я нашел еще один путь к данным, которые мне нужны для вывода пользователю. Проблема в том, что у меня есть требование от моего супервизора поддержать старый метод в случае появления столбца в качестве ненулевого числа.
Я пытаюсь сделать это либо с помощью команды case, либо с помощью команды 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 для обоих вариантов и поиск через них обоих?
As начало, я действительно рекомендую вам прекратить создание операторов SQL в коде C#, независимо от вашего случая, будет лучше, если вы используете хранимую процедуру. –
Это SQL Server, на котором выполняется этот запрос? –
Хотя кажется, что вы просто пошли и ответили на вопрос в любом случае (еще раз спасибо), он абсолютно запущен на SQL Server. – Crimthann