2012-06-19 5 views
7

Dies ist eine einfache Antwort sein kann, aber ich zu lange habe und starre es an ...Einfache dynamische TSQL Abfragesyntax

Ich habe die folgende Abfrage, die einen gespeicherte Prozedur Eingabeparameter als Variablennamen und zählt nimmt die Datensätze in dieser Tabelle. Ich möchte die Ergebnisse der dynamischen Anweisung (@toStartStr) in eine Variable (@toStart) abrufen.

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

Gerade jetzt, schlägt ein Fehler, dass @toStart kann nicht mit der Zeichenfolge SELECT verkettet werden, aber dies ist der Kern dessen, was ich will. Kann jemand sehen, was ich falsch mache? Oder eine Alternative vorschlagen? FYI SQL 2008 R2. Vielen Dank.

Antwort

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; 

Allerdings gibt es eine viel einfacher und effizienter Weg, dies zu tun, wenn Sie mit ignorierend Strom in-flight-Transaktionen in Ordnung sind (und Sie SQL Server 2005 oder besser mit - bitte die Version angeben, wenn Fragen stellen!).

DECLARE @toStart INT; 

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

PRINT @toStart; 

Nur der Vollständigkeit halber, hier ist eine Lösung für SQL Server 2000, die auch keine besonderen Privilegien benötigt (nur anschließen und Mitglied der Öffentlichkeit):

DECLARE @toStart INT; 

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

PRINT @toStart; 

sagte, dass, wenn Sie Wenn Sie eine Zählung verwenden, um festzustellen, was die nächste ID sein könnte oder etwas Ähnliches, denke ich, dass Sie sich dem falsch nähern, da Zeilen gelöscht werden können und wenn es sich um eine Identitätsspalte handelt, können Werte aufgrund von Rollbacks übersprungen werden.

+0

Es ist nicht immer wahr, dass Sie ein ** sa ** Benutzer sind. Ich denke, Admin-Rechte sind erforderlich, um diese Abfrage auszuführen. Recht? – Pankaj

+0

Nein, ich habe gerade auf einem System getestet, wo ich keine Administratorrechte habe und es läuft gut. – JNK

+0

@Kanavi Nein, zum Anzeigen von sys.partitions sind keine Administratorrechte erforderlich. Hast du es versucht, bevor du mir befohlen hast, den Code zu entfernen? –