2012-06-19 16 views
7

Esto puede ser una respuesta fácil, pero he estado mirando durante demasiado tiempo ...simple consulta TSQL dinámica sintaxis

tengo la siguiente consulta que toma un parámetro de entrada del procedimiento almacenado como un nombre de variable y el recuento los registros en esa tabla. Me gustaría recuperar los resultados de la declaración dinámica (@toStartStr) en una variable (@toStart).

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

En este momento, un error sugiere que @toStart no se puede concatenar con la cadena SELECT, pero esta es la esencia de lo que quiero. ¿Alguien puede ver lo que estoy haciendo mal? O sugerir una alternativa? FYI SQL 2008 R2. Gracias.

Respuesta

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; 

Sin embargo hay una manera mucho más fácil y más eficiente de hacer esto, si estás bien con ignorando actual en vuelo transacciones (y que está utilizando SQL Server 2005 o mejor - por favor especificar la versión cuando ¡haciendo preguntas!).

DECLARE @toStart INT; 

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

PRINT @toStart; 

simplemente para la corrección, aquí es una solución para SQL Server 2000, que también no requiere ningún privilegio especial (sólo tiene que conectar y miembro del público):

DECLARE @toStart INT; 

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

PRINT @toStart; 

Dicho esto, si Estoy usando un recuento para determinar cuál puede ser el próximo ID, o algo así, creo que te estás acercando a esto de forma incorrecta, ya que las filas se pueden eliminar y si se trata de una columna de identidad, los valores pueden omitirse debido a retrocesos.

+0

No siempre es cierto que usted es un usuario ** sa **. Creo que los derechos de administrador son necesarios para ejecutar esta consulta. ¿Derecha? – Pankaj

+0

No, acabo de probar en un sistema en el que no tengo derechos de administrador y funciona bien. – JNK

+0

@Kanavi No, los derechos de administrador no son necesarios para ver sys.partitions. ¿Lo intentó antes de decirme que elimine el código? –

Cuestiones relacionadas