Не могу ли я выбрать одновременно из фактической таблицы и из объявленной таблицы?SQL ОШИБКА - PullRequest
2 голосов
/ 10 февраля 2011

У меня уже есть несколько таблиц, и я выполнил некоторую работу.

Мое окончательное состояние ..

declare @tmptblC table(
rowIndex int identity(1,1) not null,
Officer varchar(40),
Date varchar(20),
Total_Served int,
Total_Serving_Time varchar(16),
Avg_Serving_Time varchar(16),
Log_In_Time varchar(16),
Log_Off_Time varchar(16),
Served_by_Hour int,
Total_Tran_Served int,
Total_Tran_Time varchar(16),
Avg_Tran_Time varchar(16),
Avg_Tran_Per_Cus float);

Я объявил таблицу @tmptblC

declare @dt datetime;
set @dt=cast('01-01-1980' as datetime);
insert into @tmptblC
select
loginname as 'Officer',
CONVERT(VARCHAR(10), regdate, 105) as 'Date',
count(distinct(queueno)) as 'Total_Served',
CONVERT(varchar(6), sum(datediff(second,nexttime,endtime))/3600)+ ':' + RIGHT('0' + CONVERT(varchar(2), (sum(datediff(second,nexttime,endtime)) % 3600) / 60), 2)+ ':' + RIGHT('0' + CONVERT(varchar(2), sum(datediff(second,nexttime,endtime)) % 60), 2) as 'Total_Serving_Time',
CONVERT(varchar(6), avg(datediff(second,nexttime,endtime))/3600)+ ':' + RIGHT('0' + CONVERT(varchar(2), (avg(datediff(second,nexttime,endtime)) % 3600) / 60), 2)+ ':' + RIGHT('0' + CONVERT(varchar(2), avg(datediff(second,nexttime,endtime)) % 60), 2) as 'Avg_Serving_Time',
CONVERT(VARCHAR(8), min(nexttime), 108) as 'Log_In_Time',
CONVERT(VARCHAR(8), max(nexttime), 108) as 'Log_Off_Time',
isnull(nullif(3600/datediff(second, @dt,
cast(('01-01-1980 '+
cast(CONVERT(varchar(6), avg(datediff(second,nexttime,endtime))/3600)+ ':' + RIGHT('0' + CONVERT(varchar(2), (avg(datediff(second,nexttime,endtime)) % 3600) / 60), 2)+ ':' + RIGHT('0' + CONVERT(varchar(2), avg(datediff(second,nexttime,endtime)) % 60), 2) as varchar(30)))
 as datetime)),0),0) as 'Served_by_Hour',
sum(matter_served) as 'Total_Tran_Served',
CONVERT(varchar(6), sum(matter_time)/3600)+ ':' + RIGHT('0' + CONVERT(varchar(2), (sum(matter_time) % 3600) / 60), 2)+ ':' + RIGHT('0' + CONVERT(varchar(2), sum(matter_time) % 60), 2) as 'Total_Tran_Time',
CONVERT(varchar(6), avg(matter_time)/3600)+ ':' + RIGHT('0' + CONVERT(varchar(2), (avg(matter_time) % 3600) / 60), 2)+ ':' + RIGHT('0' + CONVERT(varchar(2), avg(matter_time) % 60), 2) as 'Avg_Tran_Time',
round(sum(matter_served)/cast(count(distinct(queueno)) as float),1) as 'Avg_Tran_Per_Cus'
from @tmptblB
group by loginname, regdate

Я вставляю в @ tmptblC.

select * from @tmptblC

Я могу получить результаты от @ tmptblC.

Но ..

Когда я делаю это,

select logincode from login, @tmptblC where @tmptblC.rowIndex=1 and login.contents=@tmptblC.officer

Я получил эту ошибку.

Msg 137, Level 15, State 2, Line 109
Must declare the scalar variable "@tmptblC".

Так что я начинаю сомневаться, поскольку login таблица - это фактическая таблица, а @tmptblC - это та, которую я создал только для этого запроса.

Разве они не могут использоваться вместе?

Если это так, то какое решение.

ТКЗ.

Я узнал, что если я сделаю

select logincode from login, @tmptblC

все в порядке .. что означает ..

@tmptblC.rowIndex=1 and login.contents=@tmptblC.officer

это проблема.

1 Ответ

1 голос
/ 10 февраля 2011

Вам необходимо создать псевдоним табличных переменных, чтобы ссылаться на них в других частях запроса (например, в условии соединения). Парсер все еще не понимает, что префикс @ может ссылаться на переменную таблицы, несмотря на тот факт, что они существуют со времени SQL Server 2000 (Правка: Но, похоже, это не может быть прямым изменением сделать )!

select logincode
 from login 
join @tmptblC [@tmptblC]
on login.contents=[@tmptblC].officer
 where [@tmptblC].rowIndex=1

Чтобы ответить на вопрос в комментариях об обновлениях (вам нужно использовать это, только если ваше обновление требует объединения, в противном случае просто обратитесь к неквалифицированным именам столбцов) пример синтаксиса:

declare @t1 table (c1 int,c2 int)
declare @t2 table (c1 int,c2 int)

insert into @t1 values(1,NULL)
insert into @t2 values(1,105)

UPDATE t1
SET t1.c2 = t2.c2
FROM @t1 t1 JOIN @t2 t2 ON t1.c1 = t2.c1

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