2012-06-19 21 views
7

To może być łatwa odpowiedź, ale już patrząc na nią zbyt długo ...Prosty dynamiczny zapytań TSQL składnia

Mam następujące kwerendy, która przyjmuje parametr wejściowy procedura przechowywana jako nazwy zmiennej i liczy zapisy w tej tabeli. Chciałbym pobrać wyniki dynamicznego oświadczenia (@toStartStr) do zmiennej (@toStart).

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

Teraz błąd sugeruje, że @toStart nie mogą być łączone z ciągiem SELECT, ale to jest sedno tego, co chcę. Czy ktoś może zobaczyć, co robię źle? Lub zaproponować alternatywę? FYI SQL 2008 R2. Dzięki.

Odpowiedz

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; 

Jednak jest o wiele łatwiejsze i bardziej efektywny sposób to zrobić, jeśli jesteś w porządku z prądu ignorując w locie transakcje (i używasz SQL Server 2005 lub lepszy - proszę określić wersji po zadawać pytania!).

DECLARE @toStart INT; 

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

PRINT @toStart; 

Tylko dla kompletności, tutaj jest rozwiązanie dla SQL Server 2000, który również nie wymaga żadnych specjalnych przywilejów (wystarczy podłączyć i członek społeczeństwa):

DECLARE @toStart INT; 

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

PRINT @toStart; 

Powiedział, że jeśli "Używam liczby do określenia, jaki może być następny identyfikator lub coś podobnego, myślę, że podchodzisz do tego w niewłaściwy sposób, ponieważ wiersze można usunąć, a jeśli jest to kolumna tożsamości, wartości można pominąć z powodu wycofywania zmian.

+0

Nie zawsze jest prawdą, że jesteś użytkownikiem ** sa **. Myślę, że uprawnienia administratora są wymagane do wykonania tego zapytania. Dobrze? – Pankaj

+0

Nie, właśnie testowałem system, w którym nie mam uprawnień administratora i działa dobrze. – JNK

+0

@Kanavi Nie, uprawnienia administratora nie są wymagane do przeglądania sys.partitions. Czy próbowałeś go przed powiedzeniem mi, żebym usunął kod? –