2010-09-08 2 views
1

Я использую SQL Server 2008 Enterprise. Я использую следующий оператор в SQL Server Management Studio как часть процедуры хранилища, и появляется следующая ошибка (ошибка компиляции, когда я нажимаю F5 для запуска процедуры хранения). Но когда я удалил счет (), вся ошибка исчезнет. Любые идеи, что не так со счетом ()? Другой вопрос: моя цель - вернуть общее количество согласованного результата и вернуть часть результата для реализации подкачки (используя tt.rowNum между @startPos и ​​@requireCount + @ startPos-1), любые идеи о том, как реализовать это?Ошибка SQL Server (*)

SELECT * 
    FROM (SELECT count(*), t.id,t.AdditionalInfo, ROW_NUMBER() 
     OVER (order by t.id) AS rowNum 
FROM dbo.foo t 
    CROSS APPLY t.AdditionalInfo.nodes('/AdditionalInfo') 
      AS MyTestXMLQuery(AdditionalInfo) 
WHERE 
    (Tag4=''[email protected]+'' OR Tag5=''[email protected]+'') 
    and (MyTestXMLQuery.AdditionalInfo.value 
       ('(Item[@Name="Tag1"]/@Value)[1]', 'varchar(50)') 
      LIKE '%'[email protected]+'%' 
    or MyTestXMLQuery.AdditionalInfo.value 
       ('(Item[@Name="Tag2"]/@Value)[1]', 'varchar(50)') 
      LIKE '%'[email protected]+'%' 
    or MyTestXMLQuery.AdditionalInfo.value 
       ('(Item[@Name="Tag3"]/@Value)[1]', 'varchar(50)') 
      LIKE '%'[email protected]+'%')) tt 
    WHERE tt.rowNum between @startPos and @requireCount + @startPos-1 

Сообщение об ошибке,

Column 'dbo.foo.ID' is invalid in the select list 
     because it is not contained in either an aggregate function 
     or the GROUP BY clause. 
No column name was specified for column 1 of 'tt'. 

спасибо заранее, Джордж

ответ

4

Замените его

SELECT count(*) over() AS [Count] 

Он нужен псевдоним, как это столбец в производной таблице ,

Пустое предложение over() вернет счет во всей производной таблице. Это то, что вам нужно?

+1

Count (*) не требуется псевдоним в MS SQL – riwalk

+1

@Star Нет, но столбцы производных таблиц сделать –

+1

@ Мартин, так оно и есть. Узнавайте что-то новое каждый день. Таким образом, он в конечном итоге столкнулся с этой ошибкой, но на данный момент отсутствие GROUP BY - это то, о чем жалуется SQL Studio. – riwalk

3

Обычно вы не можете смешивать агрегатные функции и нормальные поля без предложения GROUP BY.

В запросах, где вы выбираете только COUNT(*), предполагается, что вы хотите собрать все вместе в одной группе. Как только вы выберете другое поле (без соответствующего GROUP BY), вы введете противоречие с этим предположением и оно не будет выполнено.

1

У вас должно быть предложение GROUP BY. Попробуйте следующее:

SELECT * 
FROM (SELECT 
    count(*) AS c, t.id,t.AdditionalInfo 
    FROM 
    dbo.foo t 
    CROSS APPLY 
    t.AdditionalInfo.nodes('/AdditionalInfo') AS MyTestXMLQuery(AdditionalInfo) 
    WHERE 
    (Tag4=''[email protected]+'' OR Tag5=''[email protected]+'') 
    and (MyTestXMLQuery.AdditionalInfo.value('(Item[@Name="Tag1"]/@Value)[1]', 'varchar(50)') LIKE '%'[email protected]+'%' 
    or MyTestXMLQuery.AdditionalInfo.value('(Item[@Name="Tag2"]/@Value)[1]', 'varchar(50)') LIKE '%'[email protected]+'%' 
    or MyTestXMLQuery.AdditionalInfo.value('(Item[@Name="Tag3"]/@Value)[1]', 'varchar(50)') LIKE '%'[email protected]+'%') 
    GROUP BY t.id,t.AdditionalInfo 
    ) tt 
    WHERE tt.rowNum between @startPos and @requireCount + @startPos-1 

Может быть и больше. Не уверен.

В любом случае, вам будет полезно узнать о теории модели реляционной базы данных. Этот запрос нуждается в гораздо большей помощи, чем то, что я только что добавил. Я имею в виду, что ему нужна БОЛЬШАЯ помощь.

Редактировать: Вы также не можете иметь ROW_NUMBER() в запросе, который выбирает COUNT (*). Что бы вы пытались подсчитать? Число графов?

+3

Не уверен, что этот форум предназначен, чтобы рассказать кому-то, как мало они знают. И я не уверен, что этот вопрос дает много информации о навыке как модель реляционной базы данных. – bobs

+1

@bobs. Возможно, я слишком суров на плохо написанном SQL. У меня был плохой опыт работы с кем-то, кто ничего не знал о том, как писать SQL (все же он отвечал за это ...), и я все еще немного горький. – riwalk

+1

@ bobs, он дает много информации о навыке как модельеров базы данных, кто-то, кто не берет на себя группу, не имеет никакого бизнеса, делающего работу с базой данных вообще, это день запроса базы данных. Этот человек должен знать, как SQL работает, прежде чем делать больше запросов, и если он или она разрабатывает, база данных наверняка будет плохо разработана, потому что он или она не понимает базовые понятия. @ Stargazer712 рассказывает информацию о человеке, которую он или она плохо знает, прежде чем продвигаться дальше. Он даже не был груб. – HLGEM

1

Предположения, потому что я не могу запустить его, но попробуйте изменить его:

Select * From 
    (Select count(*), t.id, t.AdditionalInfo, ROW_NUMBER() 
     OVER (order by t.id) AS rowNum 
    From dbo.foo t 
     CROSS APPLY t.AdditionalInfo.nodes('/AdditionalInfo') 
      AS MyTestXMLQuery(AdditionalInfo) 
    Where 
     (Tag4=''[email protected]+'' OR Tag5=''[email protected]+'') 
     and (MyTestXMLQuery.AdditionalInfo.value 
       ('(Item[@Name="Tag1"]/@Value)[1]', 'varchar(50)') 
      LIKE '%'[email protected]+'%' 
     or MyTestXMLQuery.AdditionalInfo.value 
       ('(Item[@Name="Tag2"]/@Value)[1]', 'varchar(50)') 
      LIKE '%'[email protected]+'%' 
     or MyTestXMLQuery.AdditionalInfo.value 
       ('(Item[@Name="Tag3"]/@Value)[1]', 'varchar(50)') 
      LIKE '%'[email protected]+'%') 
    Group By t.id, t.AdditionalInfo) tt 
Where tt.rowNum between @startPos and @requireCount + @startPos-1