Необходимо объявить скалярную переменную — уже объявленную и на которую ссылаются без проблем

#sql-server #variables

Вопрос:

 DECLARE @temp_table TABLE(
    category_id INT IDENTITY(1,1),
    category_name VARCHAR(100)
)

INSERT INTO @temp_table 
SELECT DISTINCT category.category_name
FROM category

SELECT *
FROM @temp_table
LEFT JOIN (
    SELECT SUM(year_total) 'total', cat_a_id 
    FROM fin_transactions
    GROUP BY cat_a_id
) AS table_1
ON table_1.cat_a_id = @temp_table.category_id
 

Я получаю ошибку в последней строке, где я «Должен объявить скалярную переменную «@temp_table»», но, как ни странно, ни в каких других случаях я ссылался на @temp_table. Также кажется, что я объявил об этом в строке 1

Комментарии:

1. Почему ты не пользуешься Alias @temp_table этим ?

2. Используйте псевдоним таблицы. Или измените ON условие на table_1.cat_a_id = [@temp_table].category_id

3. Ошибка пытается намекнуть на проблему. В этом положении он интерпретируется @something как имя скалярной переменной, а не табличной переменной.

4. Как вы думаете, почему здесь полезна табличная переменная? И почему вы используете DISTINCT, когда, основываясь на названии, эти строки должны быть уникальными в исходной таблице (категории)?

Ответ №1:

Используйте «Псевдоним» после FROM @temp_table , и это сработает

 DECLARE @temp_table TABLE(
    category_id INT IDENTITY(1,1),
    category_name VARCHAR(100)
)

INSERT INTO @temp_table 
SELECT DISTINCT category.category_name
FROM category

SELECT *
FROM @temp_table t  --here changed
LEFT JOIN (
    SELECT SUM(year_total) 'total', cat_a_id 
    FROM fin_transactions
    GROUP BY cat_a_id
) AS table_1
ON table_1.cat_a_id = t.category_id --and here changed
 

Комментарии:

1. @alangap23, пожалуйста, примите мой ответ, если он был полезен.