Синтаксическая ошибка в хранимой процедуре при попытке выполнить - PullRequest
1 голос
/ 01 марта 2012

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

CREATE PROCEDURE findVersions 
  @seg nvarchar(255),
  @str nvarchar(255)
AS

  DECLARE @UnsegQuery AS nvarchar(255)

  SET @UnsegQuery = SELECT DISTINCT UnsegmQuery 
                      FROM tbData 
                     WHERE SegQuery = @seg 

  SELECT TOP 1 Strategy, Versions, CGNum 
    FROM tbData 
   WHERE Strategy = @str 
     AND SegQuery = @seg 
ORDER BY CGnum DESC
  UNION
  SELECT TOP 1 Strategy, Versions 
    FROM tbData 
   WHERE Strategy = 'BF' 
     AND UnsegmQuery = @UnsegQuery
  UNION
  SELECT Strategy, Versions 
    FROM (SELECT ROW_NUMBER() OVER (ORDER BY nDCG DESC) AS rownumber 
            FROM tbData) AS foo 
   WHERE rownumber > 1

Ошибки:

Сообщение 156, Уровень 15, Состояние 1, Процедура findVersions, Строка 10
Неверный синтаксис рядом с ключевым словом «SELECT».
Сообщение 156, Уровень 15, Состояние 1, Процедура findVersions, строка 13
Неверный синтаксис рядом с ключевым словом «UNION»

Есть предложения?

Обновление Например: что мне делать с запросами.Мне нужно отобразить первый результат первого запроса, первый результат второго запроса, а затем оставшиеся три из результатов первого запроса.

1st class: (has 4 student)

Tom (Has highest score)
Rex (Hss second highest score)
Rambo (HAs 3rd highest score)
Betty (Has least score)

2nd class: (has 1 student)

Spooky (Has the highest score)

Required result order in DataControl:

Tom
Spooky
Rex
Rambo
Betty

1 Ответ

2 голосов
/ 01 марта 2012

Чтобы устранить ошибку «Неверный синтаксис рядом с ключевым словом« SELECT »», этот оператор необходимо записать в круглых скобках вокруг SELECT:

SET @UnsegQuery = (SELECT DISTINCT UnsegmQuery FROM tbData WHERE SegQuery = @seg)

Если вы используете SET для установкизначение @UnsegQuery, вы также должны быть уверены, что SELECT вернет только одно значение.В качестве альтернативы вы можете использовать:

SELECT DISTINCT @UnsegQuery = UnsegmQuery FROM tbData WHERE SegQuery = @seg

, чтобы установить значение @UnsegQuery.В этом случае, если возвращено более одной записи, @UnsegQuery будет установлено на значение последней записи.

Произошла ошибка «Неверный синтаксис рядом с ключевым словом« UNION »», поскольку вы не можетеиспользуйте ORDER BY перед UNION.Вы можете использовать ORDER BY только после последнего оператора UNION (дополнительную информацию см. В документации MSDN ).

UPDATE Чтобы ответить на ваш вопрос из вашего последнего комментария, правильный синтаксис для последней части запроса должен выглядеть примерно так:

SELECT foo.Strategy, foo.Versions 
FROM (
    SELECT Strategy, Versions, ROW_NUMBER() OVER (ORDER BY nDCG DESC) AS [rownumber] 
    FROM tbData) foo 
WHERE foo.rownumber > 1

Этот оператор выберет все записи из tbData, упорядоченные по убыванию nDCGкроме первой записи.Я не уверен, что это поможет вам решить проблему, но синтаксис правильный.

ОБНОВЛЕНИЕ 2

ОК, думаю, я понимаю проблему.Вы хотите выбрать все строки в таблице, но вы хотите, чтобы одна конкретная запись была первой, а другая конкретная запись - второй, а затем все остальные.Один из подходов к этому заключается в использовании оператора CASE WHEN для присвоения значений желаемой первой строке, желаемой второй строке, а затем сортировки по этому значению.Например:

DECLARE @myTable TABLE([ID] INT, [Student] VARCHAR(10))
INSERT INTO @myTable VALUES(1, 'Tom')
INSERT INTO @myTable VALUES(2, 'Spooky')
INSERT INTO @myTable VALUES(3, 'Rex')
INSERT INTO @myTable VALUES(4, 'Rambo')
INSERT INTO @myTable VALUES(5, 'Betty')
DECLARE @firstID INT, @secondID INT
SET @firstID = 2
SET @secondID = 4

SELECT * 
FROM @myTable
ORDER BY
    CASE 
        WHEN [ID] = @firstID THEN 1 
        WHEN [ID] = @secondID THEN 2
        ELSE 3 
    END,
    [ID]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...