2012-05-02 24 views
6

Sto cercando di analizzare una query per estrarre la logica e vedo diverse istruzioni select che usano la sintassi SELECT FROM tableName (1). Di seguito sono riportati alcuni esempi di questa sintassi utilizzata. Questa è un'istruzione di inserimento abbastanza grande, quindi non riesco a pubblicare l'intera query.In tsql cosa significa tablename (1) significa

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 

Qualcuno sa cosa significa (1) nell'istruzione from?

+0

Il (1) è in realtà stato suffisso ad un alias. Provare questo in SQL Server 2005 e 2012 genera un errore di sintassi 'Sintassi errata vicino a '1'. –

+2

in che rdbms stai vedendo questo? – Taryn

+0

Questo è in esecuzione senza problemi in SQL Server 2008. La settimana è un nome di tabulazione valido e non un alias. –

risposta

9

Ho fatto qualche ricerca e penso che quello che sta succedendo qui è che in realtà stai usando un suggerimento di query che è il '(1)'. Questo è inteso come un suggerimento INDICE Query, puoi leggere di più su questi here.

Secondo la documentazione che utilizza questo formato senza specificare WITH è deprecato e non posso farlo nel 2008, ma forse stai usando una versione specifica diversa o usi qualche modalità di compatibilità che lo riguardi.

Se è possibile fornire più risorse sulle query contenenti questa sintassi, sarei in grado di continuare a scavare.

Ecco che cosa ottengo quando corro sul mio server:

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

EDIT
Ho guardato ulteriormente in questo, partendo dal presupposto che ho ragione con la mia assunzione e

SELECT 1 FROM TABLENAME(1) 

Uguale

SELECT 1 FROM TABLENAME WITH (1) 

Quindi il sotto dimostra il punto, quando si specifica un numero maggiore rispetto al numero di indici disponibili nella tabella causerà un'eccezione. Date un'occhiata:

--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

nel link sopra riportato lo puoi trovare in Argomenti/Con. http://msdn.microsoft.com/en-us/library/ms187373.aspx – itayw

+0

grazie per la spiegazione. Non sono ancora sicuro al 100% perché lo sviluppatore abbia fatto questo, ma almeno ho saputo cosa significa. –

+0

cool :) ma, si prega di notare che (ancora una volta, supponendo che io sia corretto) significa che probabilmente stai usando il PK per la tua richiesta. Forse non produce il piano di query ottimale e vorresti recensirlo. – itayw