SQL-запрос «неверное имя столбца» - PullRequest
0 голосов
/ 30 октября 2009

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

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

SET @StoreID = tt_StoreID

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

Неверное имя столбца '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 

Ответы [ 3 ]

4 голосов
/ 30 октября 2009

Вам нужно использовать

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

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

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

0 голосов
/ 30 октября 2009

Перво-наперво: курсоры не 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 голосов
/ 30 октября 2009
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 и вам не нужно обрабатывать цикл, просто выполните для него прямой запрос.

SELECT @ StoreID = tt_StoreID, @ BatchNumber = tt_BatchNumber, @ TransactionNo = @ tt_TransactionNumber, @ ItemDesc = tt_ItemDesc FROM @txnTable where [yourkey] = @ Key

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...