2013-06-25 4 views
0

У меня есть запрос Access 2000, который работает с связанными таблицами с SQL Server 2008 R2. Мне нужно написать его как представление или пройти через запрос:подзапрос или сквозной проход; SQL Server 2008r2

`

SELECT Max(CLng((Mid([tbl1]![ID],5)))) AS lastnumberused 
FROM [tbl1] 
WHERE ((([tbl1]![ID]) Like "OODD*" And ([tbl1]![ID]) Not Like "OODDid*" And ([tbl1]![ID]) Not Like "*x") AND ((CLng((Mid([tbl1]![ID],5))))<1000000)); 

`

Так что я ищу это максимальное число под 1000000. который начинается с OODD%, но не OODDID%. Также запись не может заканчиваться на «x».

Мой код в TSQL для SQL Server выглядит так и не работает ...

`

SELECT  
convert (int, (substring(tblMain.BarcodeID,5,10))) as X1, [ID] 
FROM tblMain 
WHERE ([tbl1]![ID] LIKE N'OODD%') 
AND ([tbl1]![ID] NOT LIKE N'%x%') 
AND ([tbl1]![ID] NOT LIKE N'OODDID%') 
Select MAX (x1)+1 
from bar1 
where (x1<1000000) 

`

предложения? спасибо, H

Update 15june2013 WITH T1 (number) AS (SELECT substring(tbl1.ID,5,10) FROM tblMain AS tbl1 WHERE (ID LIKE N'oodd%') AND (ID NOT LIKE N'%x%') AND (ID NOT LIKE N'ooddID%')) SELECT (cast((number)as int)) FROM T1 Это работает и возвращает 561770 строк.

With T1(number) as(SELECT cast(SUBSTRING(ID, 5, 7)as int) FROM tblMain as tbl1 WHERE (tbl1.ID LIKE N'oodd%') AND (tbl1.ID NOT LIKE N'%x%') AND (tbl1.ID NOT LIKE N'%ooddID%') AND ISNUMERIC(SUBSTRING(tbl1.ID,5,10))=1) Select max(number) from T1 Также работает, но возвращает номер выше 1000000

Когда где оператор добавляется следующий код включает в себя записи, которые должны были быть исключены в предыдущем заявлении.

ответ

2

Предложение WHERE содержит таблицу [tbl1], которая отсутствует в предложении FROM. Вы должны либо изменить его на tblMainBee, либо добавить псевдоним «tbl1» в предложении FROM с AS.

Кроме того, у вас есть два несвязанных оператора SELECT, а не один. Опять же, во втором SELECT есть таблица bar1, которая больше нигде не появляется ... это правильно?

Другая ошибка заключается в том, что вы не можете использовать "!" для разделения имени таблицы и имени поля. Вы должны использовать точку.

И, наконец, при попытке преобразования типа данных возникают проблемы. Вам это не нужно, так как работает сравнение строк.

Ваш оператор SELECT доступа является гораздо более простым.

Попробуйте с

WITH T1(number) AS (

SELECT substring(tbl1.ID,5,LEN(tbl1.ID)-4) 
FROM tblMainBee as tbl1 
WHERE ([tbl1].[ID] LIKE N'OODD%') 
    AND ([tbl1].[ID] NOT LIKE N'%x%') 
    AND ([tbl1].[ID] NOT LIKE N'OODDID%') 
    AND (IsNumeric(substring(tbl1.ID,5,LEN(tbl1.ID)-4)) = 1) 
) 
SELECT max(convert(bigint,number)) FROM T1 WHERE number < 1000000; 

Второй тип преобразования неявно, так как числовой 1000000. Первый необходим. В противном случае он рассмотрит «12346» больше, чем «123421».

Сравнение строк выполняется только в том случае, если они имеют фиксированную длину.

С уважением,

+0

Clon- СПАСИБО. Этот код работает, и вы были правы в определении ошибки, которую я сделал в исходном сообщении. Я пытался скрыть имена таблиц и полей.Хотя это работает без ошибок, оно все равно не дает правильного ответа, который дает мой первый интерфейс доступа. Еще раз: я опубликую рабочий код позже/ – Hikerd

+0

Hikerd. Не могли бы вы показать мне ответ, который вы получите против правильного? Кроме того, существует ли какая-либо согласованная структура в содержимом поля ID? Это может помочь. – Clon

+0

Кроме того, вы должны изменить параметры подстрочной функции (5 и 10) в соответствии с вашими требованиями. Я должен был угадать их на основе данной информации. – Clon

1

Попробуйте это

select MAX(CAST(SUBSTRING(ID,5,9) as INT))+1 
from tblMainBee 
where 
    ID Like 'OODD%' 
    AND ID Not Like 'OODDid%' 
    AND ID Not Like '%x' 
    AND ISNUMERIC(SUBSTRING(ID,5,9))=1 
    AND CAST(SUBSTRING(ID,5,9) as INT)<1000000 
+0

Alexander. Спасибо за код. Это все еще возвращает предыдущую ошибку. «Ошибка конверсии при преобразовании значения nvarchar« 188540x »в тип данных int.». В настоящее время я работаю над модами Клона. – Hikerd

+0

+1 из-за функции ISNUMERIC. Я бы только изменил SUBSTRING (ID, 5,9) с SUBSTRING (ID, 5, LEN (ID) -4) для большей безопасности. – Clon

Смежные вопросы