2012-06-19 21 views
7

Questa potrebbe essere una risposta facile, ma sono stato a fissarla per troppo tempo ...semplice query TSQL dinamica sintassi

Ho la seguente query che prende un parametro di input di stored procedure come un nome di variabile e conta i record in quella tabella. Mi piacerebbe recuperare i risultati dell'istruzione dinamica (@toStartStr) in una variabile (@toStart).

-- @tempTableName = SProc input parameter 
DECLARE @toStartStr nvarchar(150); 
DECLARE @toStart int; 
SET @toStartStr = 'SELECT @toStart = COUNT(ID) FROM ' + @tempTableName; 
EXEC(@toStartStr); 

In questo momento, un errore suggerisce che @toStart non può essere concatenato con la stringa di SELECT, ma questo è l'essenza di ciò che voglio. Qualcuno può vedere cosa sto facendo male? O suggerire un'alternativa? FYI SQL 2008 R2. Grazie.

risposta

11
DECLARE @sql NVARCHAR(255); 

DECLARE @toStart INT; 

SET @sql = N'SELECT @toStart = COUNT(ID) FROM ' + QUOTENAME(@tempTableName); 

EXEC sp_executesql @sql, N'@toStart INT OUTPUT', @toStart OUTPUT; 

PRINT @toStart; 

Tuttavia c'è un modo molto più semplice e più efficace per farlo, se stai bene con ignorando corrente in volo transazioni (e si sta utilizzando SQL Server 2005 o meglio - si prega di specificare la versione quando fare domande!).

DECLARE @toStart INT; 

SELECT @toStart = SUM(rows) 
    FROM sys.partitions 
    WHERE [object_id] = OBJECT_ID(@tempTableName) 
    AND index_id IN (0,1); 

PRINT @toStart; 

Solo per completezza, ecco una soluzione per SQL Server 2000, che inoltre non richiede alcun privilegio speciale (basta collegare e membro del pubblico):

DECLARE @toStart INT; 

SELECT @toStart = [rows] 
    FROM sysindexes 
    WHERE id = OBJECT_ID(@tempTableName) 
    AND indid IN (0,1); 

PRINT @toStart; 

Detto questo, se si Stai usando un conteggio per determinare quale potrebbe essere il prossimo ID, o qualcosa del genere, penso che ti stai avvicinando al modo sbagliato, dal momento che le righe possono essere cancellate e se si tratta di una colonna di identità i valori possono essere saltati a causa dei rollback.

+0

Non è sempre vero che sei un utente ** sa **. Penso che i diritti di amministratore siano necessari per eseguire questa query. Destra? – Pankaj

+0

No, ho appena eseguito il test su un sistema in cui non dispongo di diritti di amministrazione e funziona correttamente. – JNK

+0

@ Kanavi No, i diritti di amministratore non sono richiesti per visualizzare sys.partitions. Hai provato prima di dirmi di rimuovere il codice? –