2009-10-30 3 views
0

Следующий sql-запрос работает отлично, если я оставляю комментарии из четырех комментариев SET.SQL Query 'недопустимое имя столбца'

Однако, если я раскомментировать их, или просто сказать, что я раскомментировать первый один

SET @StoreID = tt_StoreID 

тогда я получаю следующее сообщение

имя Invalid колонка 'tt_StoreID'

Почему он не распознает его и как его исправить?

*--------------------------------- 

DECLARE @txnTable table (
tt_StoreID int, 
tt_StoreName nvarchar (50), 
tt_BatchNumber int, 
tt_OpeningTime datetime, 
tt_ClosingTime datetime, 
tt_TransactionNumber int, 
tt_Price money, 
tt_Quantity float, 
tt_TenderID int, 
tt_TenderDesc nvarchar (25), 
tt_TEID int, 
tt_ItemID int, 
tt_ItemLookupCode nvarchar (25), 
tt_ItemDesc nvarchar (30) 
) 

INSERT @txnTable 

SELECT Distinct dbo.Batch.StoreID, 
dbo.Store.Name, 
dbo.Batch.BatchNumber, 
dbo.Batch.OpeningTime, 
dbo.Batch.ClosingTime, 
dbo.TransactionEntry.TransactionNumber, 
dbo.TransactionEntry.Price, 
dbo.TransactionEntry.Quantity, 
dbo.view_TenderEntry_Distinct_TenderID.TenderID, 
dbo.view_TenderEntry_Distinct_TenderID.Description 
AS TenderDesc, 
dbo.TransactionEntry.ID AS TEID, 
dbo.Item.ID, 
dbo.Item.ItemLookupCode, 
dbo.Item.Description 

FROM dbo.Store 
INNER JOIN 
dbo.Batch ON dbo.Store.ID = dbo.Batch.StoreID 
INNER JOIN 
dbo.[Transaction] 
ON dbo.[Transaction].BatchNumber = Batch.BatchNumber 
AND dbo.[Transaction].StoreID = Batch.StoreID 
INNER JOIN 
dbo.TransactionEntry 
ON dbo.[Transaction].StoreID = dbo.TransactionEntry.StoreID 
AND dbo.[Transaction].TransactionNumber = dbo.TransactionEntry.TransactionNumber 
INNER JOIN 
dbo.view_TenderEntry_Distinct_TenderID 
ON dbo.Batch.StoreID = dbo.view_TenderEntry_Distinct_TenderID.StoreID 
AND dbo.Batch.BatchNumber = dbo.view_TenderEntry_Distinct_TenderID.BatchNumber 
AND dbo.TransactionEntry.TransactionNumber = dbo.view_TenderEntry_Distinct_TenderID.TransactionNumber 
INNER JOIN 
dbo.Item ON dbo.TransactionEntry.ItemID = dbo.Item.ID 

WHERE Batch.BatchNumber = 28613 

ORDER BY Batch.StoreID, 
Batch.BatchNumber, 
TransactionEntry.TransactionNumber, 
Item.Description 

-- 

DECLARE @StoreID int 
DECLARE @BatchNumber int 
DECLARE @TransactionNo int 
DECLARE @ItemDesc nvarchar (30) 

DECLARE ttCursor CURSOR FOR 
SELECT tt_StoreID, 
tt_StoreName, 
tt_BatchNumber, 
tt_OpeningTime, 
tt_ClosingTime, 
tt_TransactionNumber, 
tt_Price, 
tt_Quantity, 
tt_TenderID, 
tt_TenderDesc, 
tt_TEID, 
tt_ItemID, 
tt_ItemLookupCode, 
tt_ItemDesc 
FROM @txnTable 
OPEN ttCursor 

FETCH NEXT from ttCursor 

-- The four lines below are where the errors occur 

-- SET @StoreID = tt_StoreID 
-- SET @BatchNumber = tt_BatchNumber 
-- SET @TransactionNo = tt_TransactionNumber 
-- SET @ItemDesc = tt_ItemDesc 

WHILE (@@FETCH_STATUS = 0) 
BEGIN 
FETCH NEXT from ttCursor 
END 
CLOSE ttCursor 
DEALLOCATE ttCursor 

SELECT * FROM @txnTable 

ответ

4

Вы должны использовать

FETCH NEXT FROM ttCursor INTO @StoreID, @BatchNumber, @TransactionNo, @ItemDesc 

Кроме того, цикл, который перебирает над курсором в данный момент ничего не делает, но это, вероятно, потому, что ты был остановлен с «получать данные в переменные» часть.

Edit:
в то время как с помощью INTO @variable конструкта «на правильном пути», то фрагмент кода, показанный только это изменение не получится, так как курсор имеет больше строк столбцов, объявленные чем переменные, упоминаемые в INTO пункт. Простое исправление заключается в том, чтобы либо добавлять переменные, либо удалять столбцы в списке SELECT курсора. Трудно быть более конкретным, поскольку цель OP не очевидна в коде (пустой цикл, отсутствие действия/использования на основе четырех отображаемых переменных ...) или вопрос.

+0

Это не будет работать, как его курсор имеет больше полей, чем просто те четыре, которые не являются первые четыре – MartW

+0

Вы получите эту ошибку: «Cursorfetch: количество переменных, объявленных в списке INTO, должно соответствовать количеству выбранных столбцов». – MartW

+0

@CodeByMoonlight, Вы правы, см. Мое редактирование. Я не уверен в намерениях Лори MC, OP. Очевидно, что ему понадобится только получить нужные строки (или предоставить фиктивную переменную для строк «необходимо» для запроса, но не для процесса, если есть такой случай) – mjv

0
Set @RowA = Cursor For 
SELECT tt_StoreID, 
tt_BatchNumber, 
tt_TransactionNumber 
tt_ItemDesc 
FROM @txnTable 

Open @RowA 
Fetch Next From @RowA 
Into @StoreID, @BatchNumber, @TransactionNo, @ItemDesc 
    While (@@Fetch_Status=0) 
     begin 
     [do work] 

      Fetch Next From @RowA 
      Into @StoreID, @BatchNumber, @TransactionNo, @ItemDesc 
     end 
    Close @RowA 

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

ВЫБРАТЬ @ StoreID = tt_StoreID, @ BatchNumber = tt_BatchNumber, @ TransactionNo = @ tt_TransactionNumber, @ ItemDesc = tt_ItemDesc ОТ @txnTable где [yourkey] = @ Key

+0

как вы переходите от одной строки к следующей? –

+0

теперь, если ему просто нужна первая строка значений, он может просто запустить первый оператор для курсора и закрыть его, поскольку он выглядит так, как будто ему нужна только одна строка. Если это быстро, то прямой запрос Select A в @A от T будет достаточным и будет намного проще. – Middletone

0

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

Сказав/разглагольствовал, что, вот как ваш код Курсор должен быть изменен:

FETCH NEXT from ttCursor INTO @tt_StoreID, @tt_StoreName, @tt_BatchNumber, @tt_OpeningTime, @tt_ClosingTime, 
    @tt_TransactionNumber, @tt_Price, @tt_Quantity, @tt_TenderID, @tt_TenderDesc, 
    @tt_TEID, @tt_ItemID, @tt_ItemLookupCode, @tt_ItemDesc 


WHILE (@@FETCH_STATUS = 0) 
BEGIN 

    SET @StoreID = @tt_StoreID 
    SET @BatchNumber = @tt_BatchNumber 
    SET @TransactionNo = @tt_TransactionNumber 
    SET @ItemDesc = @tt_ItemDesc 

    /* YOUR QUERY GOES HERE */ 

    FETCH NEXT from ttCursor INTO @tt_StoreID, @tt_StoreName, @tt_BatchNumber, @tt_OpeningTime, @tt_ClosingTime, 
     @tt_TransactionNumber, @tt_Price, @tt_Quantity, @tt_TenderID, @tt_TenderDesc, 
     @tt_TEID, @tt_ItemID, @tt_ItemLookupCode, @tt_ItemDesc 
END 
CLOSE ttCursor 
DEALLOCATE ttCursor 
+0

Та же проблема, что и решение mjv – MartW

+0

tx. изменено, чтобы отражать комментарии. –

+0

@RajMore - «Не используйте курсоры! Используйте этот curosr». А? – MAW74656

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