Sanjoy Das2 Ответов: 4

Неверный синтаксис рядом с 'NULL'. Ошибка в SQL server 2012


В следующем коде я получаю ошибку в SQL Server 2012
Msg 102, Уровень 15, Состояние 1, Строка 4
Неверный синтаксис рядом с 'NULL'.
SELECT TBLTRANSUSERS.FirstName + ' ' + TBLTRANSUSERS.LastName + '(' + TBLTRANSUSERS.UserCode + ')' as 'User Name',TBLTRANSJOBS.JobName as 'Job Name', TBLTRANSDOCUMENTS.DocName as 'Loan Name',Convert(Varchar(25),AssignedDate,131) as 'Assigned Date',
(SELECT RIGHT('0' + CAST(Datediff(second,AssignedDate,GetDate()) / 3600 AS VARCHAR),2) + ':' + RIGHT('0' + CAST((Datediff(second,AssignedDate,GetDate()) / 60) % 60 AS VARCHAR),2) + ':' + RIGHT('0' + CAST(Datediff(second,AssignedDate,GetDate()) % 60 AS VARCHAR),2) as 'Elapsed Time'
FROM ((TBLTRANSDOCUMENTS inner join TBLTRANSJOBS ON TBLTRANSJOBS.JobID = TBLTRANSDOCUMENTS.JobID) inner join TBLTRANSUSERS on TBLTRANSDOCUMENTS.ExtractionAssigned=TBLTRANSUSERS.UserID) WHERE KeyedDate is NULL and 
ExtractionAssigned is not NULL


Что я уже пробовал:

В этой проблеме нет никаких решений.

4 Ответов

Рейтинг:
6

Sanjoy Das2

SELECT TBLTRANSUSERS.FirstName + ' ' + TBLTRANSUSERS.LastName + '(' + TBLTRANSUSERS.UserCode + ')' as 'User Name',TBLTRANSJOBS.JobName as 'Job Name', TBLTRANSDOCUMENTS.DocName as 'Loan Name',AssignedDate as 'Assigned Date',
                                            (SELECT RIGHT('00' + CAST(Datediff(second,D.AssignedDate,GetDate()) / 3600 AS VARCHAR),3) + ':' + RIGHT('0' + CAST((Datediff(second,D.AssignedDate,GetDate()) / 60) % 60 AS VARCHAR),2) + ':' + RIGHT('0' + CAST(Datediff(second,D.AssignedDate,GetDate()) % 60 AS VARCHAR),2) FROM TBLTRANSDOCUMENTS D Where D.DocID=TBLTRANSDOCUMENTS.DocID) as 'Elapsed Time'
                                            FROM ((TBLTRANSDOCUMENTS  inner join TBLTRANSJOBS ON TBLTRANSJOBS.JobID = TBLTRANSDOCUMENTS.JobID) inner join TBLTRANSUSERS on TBLTRANSDOCUMENTS.ExtractionAssigned=TBLTRANSUSERS.UserID) WHERE KeyedDate is NULL and 
                                            ExtractionAssigned is not NULL order by TBLTRANSUSERS.Firstname


CHill60

Нет необходимости во встроенных подзапросах

Рейтинг:
2

OriginalGriff

Мы не можем решить эту проблему за вас - у нас нет доступа к вашим данным, и это, вероятно, будет очень важно для решения проблемы.

Поэтому начните с того, что сократите его до минимума, и посмотрите, работает ли он и предоставляет ли правильные данные.
Возможно только это:

SELECT FirstName, LastName, UserCode, TBLTRANSJOBS.JobName, TBLTRANSDOCUMENTS.DocName, AssignedDate
FROM TBLTRANSDOCUMENTS 
inner join TBLTRANSJOBS ON TBLTRANSJOBS.JobID = TBLTRANSDOCUMENTS.JobID
Затем медленно добавляйте биты обратно, пока проблема не повторится.
Когда это произойдет, посмотрите на то, что вы добавили, и посмотрите, как это повлияет на данные.

Но мы ничего не можем сделать для вас!


Рейтинг:
1

CHill60

В дополнение к обоснованным комментариям в решениях 1 и 2 Вот еще несколько советов...

1. оставьте форматирование вывода на уровне пользовательского интерфейса, а не на уровне данных ... так что вместо этого

TBLTRANSUSERS.FirstName + ' ' + TBLTRANSUSERS.LastName + '(' + TBLTRANSUSERS.UserCode + ')' as 'User Name'
просто верните все необходимые части и позвольте бизнесу или слою пользовательского интерфейса отформатировать их соответствующим образом.
TBLTRANSUSERS.FirstName, TBLTRANSUSERS.LastName, TBLTRANSUSERS.UserCode
Непосредственным преимуществом этого является то, что ваш код может быть повторно использован в тех случаях, когда вы не хотите объединять поля. Он также будет работать более эффективно.

2. Особенно не преобразования дат в строки в SQL. Очень неэффективно, и это также означает, что вызывающий код должен выполнить преобразование данных обратно на сегодняшний день.
Convert(Varchar(25),AssignedDate,131) as 'Assigned Date',
так и должно быть
AssignedDate as 'Assigned Date',
3. постарайтесь избавиться от привычки использовать пробелы в именах полей ("назначенная дата", "имя пользователя"). Это настоящая Пита, которая использует квадратные скобки для ссылки на имя столбца и может привести к труднодоступным ошибкам, вносимым в ваш код.

4. Будьте последовательны! Вы использовали имена таблиц, чтобы однозначно идентифицировать многие из ваших столбцов кроме для AssignedDate ..- с какого стола это доносится? То же самое верно и для столбцов в предложении WHERE. Возможно, вы также захотите рассмотреть возможность использования коротких псевдонимов для таблиц - это сэкономит немного времени на вводе текста, а также может сделать вещи немного понятнее

5. Это
(
	SELECT RIGHT('0' + CAST(Datediff(second,AssignedDate,GetDate()) / 3600 AS VARCHAR),2) + ':' + 
		RIGHT('0' + CAST((Datediff(second,AssignedDate,GetDate()) / 60) % 60 AS VARCHAR),2) + ':' + 
		RIGHT('0' + CAST(Datediff(second,AssignedDate,GetDate()) % 60 AS VARCHAR),2
) as 'Elapsed Time'
это действительно ужасно, но в любом случае относится к слою пользовательского интерфейса. Самое большее верните разницу во времени в секундах, если вам действительно нужно.

Попробуйте применить эти изменения и сравнить отдачу от SQL Profiler (Запуск SQL Server Profiler | Microsoft Docs[^] кроме того, здесь есть статьи о CodeProject)


Рейтинг:
0

Kornfeld Eliyahu Peter

Форматирование кода в соответствующий блок - хорошая идея-это помогает найти незамкнутые/неправильно вложенные блоки кода...
В вашем случае отсутствует ) (закрывающая скобка) в конце, после чего не является нулем...