2012-05-02 11 views
6

Próbuję przeanalizować zapytanie, aby wyodrębnić logikę i widzę kilka instrukcji select, które używają składni SELECT FROM tableName (1). Poniżej kilka przykładów użycia tej składni. Jest to dość duża instrukcja wstawiania, więc nie mogę opublikować całego zapytania.W tsql co znaczy tablename (1)

select nh.firm_code, nh.acct_num, nh.sub_code, b.amt 
from nav_hist nh(1), breakpoints b 
where nh.sales_load_id = b.schedule_id 

select sum(weekdays.factor) 
from calc_hist weekdays(1) 
where weekdays.sys_date >= dateadd(dd, f.usr_num_days - 7, f.sys_date) 
     and weekdays.sys_date < f.sys_date 
     and c.firm_code = weekdays.firm_code 

Czy ktoś wie, co (1) oznacza w instrukcji from?

+0

(1) jest faktycznie dodawany do aliasu. Testowanie tego w SQL Server 2005 i 2012 powoduje błąd składni "Niepoprawna składnia w pobliżu" 1 ". –

+2

jakiego rdbms widzisz? – Taryn

+0

To działa bez problemu w SQL Server 2008. Dni tygodnia to poprawna nazwa, a nie alias. –

Odpowiedz

9

Zrobiłem trochę kopania i myślę, że to, co się tutaj dzieje, to fakt, że używasz podpowiedzi do zapytania, która jest "(1)". Jest to intranet jako wskazówka do zapytania INDEX, możesz przeczytać więcej o tych here.

Zgodnie z dokumentacją używającą tego formatu bez specyfiki Z jest przestarzałe i nie mogę tego zrobić w 2008 r., Ale może używasz innej konkretnej wersji lub używasz jakiegoś trybu zgodności, który ma na to wpływ.

Jeśli możesz zapewnić więcej zasobów na zapytania zawierające te składnie, będę mógł kontynuować kopanie.

Oto co otrzymuję, gdy biegnę na moim serwerze:

select * from sysobjects WITH (1) 
--Warning: Index hints supplied for view 'sysobjects' will be ignored. 

EDIT
szukałem dalej w to, zakładając, że mam rację z moim założeniem i

SELECT 1 FROM TABLENAME(1) 

Równa

SELECT 1 FROM TABLENAME WITH (1) 

Następnie poniższy przykład dowodzi, że określenie liczby całkowitej większej niż liczba indeksów dostępnych w tabeli spowoduje wyjątek. Spójrz:

--Table sysjobs has 4 indexes 
select * from msdb..sysjobs with (4) 
--1 row affected 
select * from msdb..sysjobs with (5) 
--Msg 307, Level 16, State 1, Line 2 
--Index ID 5 on table 'msdb..sysjobs' (specified in the FROM clause) does not exist. 
+0

w powyższym linku można go znaleźć w sekcji Argumenty/Z. http://msdn.microsoft.com/en-us/library/ms187373.aspx – itayw

+0

dzięki za wyjaśnienie. Nadal nie jestem w 100% pewna, dlaczego programista to zrobił, ale przynajmniej dowiedziałem się, co to oznacza. –

+0

fajne :) ale pamiętaj, że (ponownie, zakładając, że mam rację) oznacza to, że prawdopodobnie używasz PK dla twojego zapytania. Może nie tworzy optymalnego planu zapytania i chcesz go przejrzeć. – itayw