none
EXEC sp_executesql OUTPUT RRS feed

  • Вопрос

  • Всем доброго времени суток. Пол дня сравниваю 4 строчки у меня в коде и мсдн и не нахожу в чем косяк. Требуется подсчитать кол-во записей в таблицах (пока для упрощения взял топ 1, но потом хочу закинуть это в процедуру или функцию):

    GO
    BEGIN
    DECLARE
    @countrows int,
    @tablename NVARCHAR(100),
    @params NVARCHAR(100),
    @sql NVARCHAR(100);
    EXEC sp_executesql N'SELECT TOP 1 [TABLE_NAME] FROM [AdventureWorksDW].[INFORMATION_SCHEMA].[TABLES]', N'@tablenameout NVARCHAR(100) OUTPUT', @tablenameout = @tablename OUTPUT;
    SET @sql = N'SELECT @Kolvo = COUNT (*) FROM [AdventureWorksDW].[dbo].' + @tablename;
    SET @params = N'@countrowsout int OUTPUT';
    EXEC sp_executesql @sql, @params, @countrowsout = @countrows OUTPUT;
    SELECT @countrows;
    END

    При отладке видно, что не заполняется @tablename и даже @sql=NULL о_О

     

    27 октября 2010 г. 16:17

Ответы

Все ответы

  • DECLARE 
    @countrows int, 
    @tablename NVARCHAR(100), 
    @params NVARCHAR(100), 
    @sql NVARCHAR(100);
    EXEC sp_executesql N'SELECT TOP 1 @tablenameout=[TABLE_NAME] FROM [INFORMATION_SCHEMA].[TABLES]', N'@tablenameout NVARCHAR(100) OUTPUT', @tablenameout = @tablename OUTPUT;
    
    SET @sql = N'SELECT @countrowsout = COUNT (*) FROM [dbo].' + @tablename;
    SET @params = N'@countrowsout int OUTPUT';
    EXEC sp_executesql @sql, @params, @countrowsout = @countrows OUTPUT;
    
    SELECT @tablename as TableName, @countrows as RowsCount;
    

    http://www.t-sql.ru
    27 октября 2010 г. 16:51
    Модератор
  • Только мне кажется, что вы велосипед изобретаете... может так:

    --Создаем таблицу, куда складываем весь результат
    if object_id( 'dbo.AllTablesRowCount', 'U' ) is not null
    drop table dbo.AllTablesRowCount
    go
    create table dbo.AllTablesRowCount(name sysname
    , rows int
    , reserved varchar(20)
    , data varchar(20)
    , index_size varchar(20)
    , unused varchar(20)
    )
    go
    --Собираем статистику по ВСЕМ таблицам
    exec sp_MSforeachtable 'insert into dbo.AllTablesRowCount exec sp_spaceused "?"'
    go
    --Смотрим
    select * from AllTablesRowCount order by name
    go
    --Подчищаем
    drop table dbo.AllTablesRowCount
    go
    

    http://www.t-sql.ru
    27 октября 2010 г. 16:59
    Модератор
  • ...Требуется подсчитать кол-во записей в таблицах...
    select 
    	o.name,
    	p.row_count
    from
    	sys.objects o
    	inner join sys.dm_db_partition_stats p
    	on o.object_id = p.object_id
    where
    	o.type = 'U'
    	and (p.index_id=0 or p.index_id=1)
    

     


    Gruß Yury

     

    • Помечено в качестве ответа kosmich74 28 октября 2010 г. 5:59
    27 октября 2010 г. 19:18
  • How to get information about all databases without a loop

    DECLARE @DynamicSQL NVARCHAR(MAX)
     
    SELECT  @DynamicSQL = COALESCE(@DynamicSQL + CHAR(13) + ' UNION ALL ' + CHAR(13),
                    '') +
                    'SELECT ' + QUOTENAME(table_schema,'''') + ' as [Schema Name], ' +
                    QUOTENAME(TABLE_NAME,'''') +
                    ' as [Table Name], COUNT(*) AS [Records Count] FROM ' +
                    QUOTENAME(Table_schema) + '.' + QUOTENAME(TABLE_NAME)
    FROM   INFORMATION_SCHEMA.TABLES
    ORDER BY TABLE_NAME
     
    --print (@DynamicSQL) -- we may want to use PRINT to debug the SQL
    EXEC( @DynamicSQL)
    


    Premature optimization is the root of all evil in programming. (c) by Donald Knuth

    Naomi Nosonovsky, Sr. Programmer-Analyst

    My blog
    27 октября 2010 г. 19:49
  • спасибо комрады! ошибку нашел и кучу др вариантов решения! я еще один особо извращенский родил:

    DECLARE @tablename NVARCHAR(100);
    DECLARE AllTables CURSOR FOR
    SELECT [TABLE_NAME] FROM [baby].[INFORMATION_SCHEMA].[TABLES]
    OPEN AllTables;
    FETCH NEXT FROM AllTables INTO @tablename;
    WHILE (@@FETCH_STATUS = 0)
    BEGIN
    DECLARE
    @countrows int,
    @params NVARCHAR(100),
    @sql NVARCHAR(100);
    SET @sql = N'SELECT @countrowsout = COUNT (*) FROM [baby].[dbo].' + QUOTENAME(@tablename);
    SET @params = N'@countrowsout int OUTPUT';
    EXEC sp_executesql @sql, @params, @countrowsout = @countrows OUTPUT;
    SELECT @tablename as TableName, @countrows as RowsCount;
    FETCH NEXT FROM AllTables INTO @tablename;
    END;
    CLOSE AllTables;
    DEALLOCATE AllTables;
    GO

    Но самое изящное будет через sys.objects :)

    28 октября 2010 г. 6:26
  • Но самое изящное будет через sys.objects :)


    к сожалению не универсальный =((( на 2000м не сработает!
    http://www.t-sql.ru
    28 октября 2010 г. 6:56
    Модератор