Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Подсчет записей во множестве одинаковых таблиц  [new]
Sergey3999
Member

Откуда:
Сообщений: 13
Уважаемые гуру языка SQL. Прошу помочь в решении задачи.

На сервере MS SQL 2000, некая программа записывает ежечасно данные в таблицы,
база данных Journals,
имя таблиц таково: [Journals].[dbo].[allall20120123090000] - в этой таблице записаны данные за один час с 9-00 до 10-00 23 января 2012 года
время в виде '20120123090000' хранится в таблице allall в поле TRSTIME,
т.е. SELECT [TRSTIME] FROM [Journals].[dbo].[allall]
выдаст все существующие времена.

Нам нужно подсчитать количество записей во всех таблицах.

т.е. SELECT count(*) FROM [Journals].[dbo].[allall_время из поля TRSTIME_]
напр. SELECT count(*) FROM [Journals].[dbo].[allall20120123090000] и т.д.

т.е. по запросу SELECT [TRSTIME] FROM [Journals].[dbo].[allall] получить все переменные TRSTIME
подставлять их в запрос SELECT count(*) FROM [Journals].[dbo].[allall+TRSTIME]
и накапливать count(*) в какую-нибудь переменную.

Увы я не программист и в округе на MSSQL никто не пишет.
А руководство попросило посчитать.
Если поможете буду очень благодарен, но денег обещать не могу.
23 янв 12, 08:33    [11949534]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет записей во множестве одинаковых таблиц  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6201
Как-то так:
declare
  @t table (name nvarchar(128));
insert into @t values ('table1');
insert into @t values ('table2');
insert into @t values ('table3');

select t.name, SUM (
      CASE
        WHEN (s.index_id < 2) THEN s.row_count
        ELSE 0
      END
      ) from sys.dm_db_partition_stats s, @t t where s.object_id = object_id(t.name)
      group by t.name;
23 янв 12, 09:48    [11949792]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет записей во множестве одинаковых таблиц  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6201
Пардон, не заметил - нужно вообще по всем. Тогда из приведенного выше убрать группировку.
23 янв 12, 09:51    [11949808]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет записей во множестве одинаковых таблиц  [new]
aleks2
Guest
declare @sql varchar(8000)

set @sql=''

select @sql=@sql+'SELECT count(*) c FROM [Journals].[dbo].[allall'+ TRSTIME +'] union all'
from  [Journals].[dbo].[allall]

set @sql='select sum(c) Total FROM ('+
substring(@sql, 1, LEN(@sql)-10)
+') X'

exec(@sql)
23 янв 12, 10:43    [11950140]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет записей во множестве одинаковых таблиц  [new]
Sergey3999
Member

Откуда:
Сообщений: 13
Спасибо за быстрые ответы!

Сну Веры Павловны,
я понял - пример для 3- таблиц? или нет?
У нас увы их 7800.

2 aleks2

на ваш скрипт выдает ошибку

Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near 'allSELECT'.
Msg 105, Level 15, State 1, Line 1
Unclosed quotation mark before the character string 'allall2011030'.

не понятно где обрезает TRSTIME должно быть allall20110304150000
не 13 символов, а 20

если заремарю часть
declare @sql varchar(8000)

set @sql=''

select @sql=@sql+'SELECT count(*) c FROM [Journals].[dbo].[allall'+ TRSTIME +'] union all'
from [Journals].[dbo].[allall]

/*set @sql='select sum(c) Total FROM ('+ substring(@sql, 1, LEN(@sql)-10) +') X'*/

exec(@sql)

выдает:
Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near 'allSELECT'.
23 янв 12, 13:30    [11951775]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет записей во множестве одинаковых таблиц  [new]
Sergey3999
Member

Откуда:
Сообщений: 13
2 aleks2
eckb после union all' сделать пробел после all union all '

то ошибка


Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near 'с'.
23 янв 12, 14:07    [11952222]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет записей во множестве одинаковых таблиц  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Sergey3999
У нас увы их 7800.


Sergey3999
выдает:
Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near 'allSELECT'.

Нивлизает .
23 янв 12, 14:17    [11952326]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет записей во множестве одинаковых таблиц  [new]
Sergey3999
Member

Откуда:
Сообщений: 13
Танцы с бубном продолжаются.

Если поставить дополнительные кавычки (подчеркнуты) и запрос будет следующий

declare @sql varchar(8000)
set @sql=''
select @sql=@sql+''SELECT count(*) с FROM [Journals].[dbo].[allall'+ TRSTIME +']' union all'
from [Journals].[dbo].[allall]

set @sql='select sum(c) Total FROM ('+ substring(@sql, 1, LEN(@sql)-10) +') X'

exec(@sql)

то ошибка

Msg 170, Level 15, State 1, Line 4
Line 4: Incorrect syntax near ' union all'.
23 янв 12, 14:28    [11952468]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет записей во множестве одинаковых таблиц  [new]
aleks2
Guest
7800 не влезут в 8000 символов. Увы.

declare @sql varchar(8000), @t varchar(20), @i int, @bi bigint

select @t=min(TRSTIME) FROM [Journals].[dbo].[allall]
set @bi=0

while @t is not null begin
  set @sql='SELECT @i=count(*) FROM [Journals].[dbo].[allall'+ @t +']'
  sp_executesql @sql, N'@i int OUTPUT', @i=@i OUTPUT
  set @bi=@bi+@i
  set @t=(select min(TRSTIME) FROM [Journals].[dbo].[allall] WHERE TRSTIME>@t)
end

select @bi


Тока сами понимаете, отлаживать мне его неохота и не на чем.
23 янв 12, 14:41    [11952623]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет записей во множестве одинаковых таблиц  [new]
invm
Member

Откуда: Москва
Сообщений: 9824
Ну и до кучи, доработанный вариант из 11949792
with t (name) as
(
 select
  'dbo.' + quotename('allall' + TRSTIME)
 from
  Journals.dbo.allall
)
select
 sum(ps.row_count)
from
 t join
 sys.dm_db_partition_stats ps on ps.object_id = object_id(t.name, 'U')
where
 ps.index_id in (0, 1);
23 янв 12, 14:53    [11952769]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет записей во множестве одинаковых таблиц  [new]
Sergey3999
Member

Откуда:
Сообщений: 13
Ок, огромное спасибо за помощь.
Я вас прекрасно понимаю.
Для информации на последний скрипт ошибка
автор
Msg 170, Level 15, State 1, Line 9
Line 9: Incorrect syntax near 'sp_execute'.


а если в предыдущем добавить условие например
автор
where TRSTIME < '20110401000000'

то число таблиц уменьшается до 650
и на запрос

автор
declare @sql varchar(8000)

set @sql=''

select @sql=@sql+'SELECT count(*) c FROM [Journals].[dbo].[allall'+ TRSTIME +'] union all'
from [Journals].[dbo].[allall]
where TRSTIME < '20110401000000'

set @sql='select sum(c) Total FROM ('+
substring(@sql, 1, LEN(@sql)-10)
+') X'

exec(@sql)



ошибка как и ранее

автор
Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near 'allSELECT'.
Msg 105, Level 15, State 1, Line 1
Unclosed quotation mark before the character string 'allall2011030'.


автор
set @sql=''

select @sql=@sql+'SELECT count(*) c FROM [Journals].[dbo].[allall'+ TRSTIME +'] union all'
from [Journals].[dbo].[allall]
where TRSTIME < '20110401000000'

set @sql='select sum(c) Total FROM ('+
substring(@sql, 1, LEN(@sql)-10)
+') X'

exec(@sql)



ошибка таже
автор
Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near 'allSELECT'.
Msg 105, Level 15, State 1, Line 1
Unclosed quotation mark before the character string 'allall2011030'.
23 янв 12, 15:15    [11952992]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет записей во множестве одинаковых таблиц  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Sergey3999, освойте:
PRINT @sql

существенно упростит жизнь, особенно в случае динамики.
23 янв 12, 15:30    [11953157]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет записей во множестве одинаковых таблиц  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Sergey3999,

перед "SELECT" поставить пробел не судьба?
23 янв 12, 15:32    [11953178]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет записей во множестве одинаковых таблиц  [new]
ZOOKABAKODER
Member

Откуда:
Сообщений: 178
Вот NOSQL вариант :-) :
[String]$strSrv = '<имя сервака суда>';
[String]$strDB = '<имя бд суда>';

[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | Out-Null

[Microsoft.SqlServer.Management.Smo.Server]$objSrv `
	= New-Object `
		-TypeName 'Microsoft.SqlServer.Management.Smo.Server' `
		-ArgumentList $strSrv
[Microsoft.SqlServer.Management.Common.ServerConnection]$objCnn = $objSrv.ConnectionContext

$objDB = $objSrv.Databases[$strDB];
[Int64]$RowCnt = 0;
$objDB.Tables `
	| Where-Object {($_.Schema -eq 'dbo') -and ($_.Name -match '^allall\d+$')} `
	| ForEach-Object {$RowCnt += $_.RowCount};
"Всего записей вышло $RowCnt";

$objSrv = $null;
$objCnn.Disconnect();

Пуск-> ... -> Powershell
23 янв 12, 15:40    [11953262]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет записей во множестве одинаковых таблиц  [new]
Sergey3999
Member

Откуда:
Сообщений: 13
iap,

спасибо теперь ошибка
Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near ')'.
23 янв 12, 15:41    [11953273]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет записей во множестве одинаковых таблиц  [new]
aleks2
Guest
declare @sql nvarchar(4000), @t nvarchar(20), @i int, @bi bigint

select @t=min(TRSTIME) FROM [Journals].[dbo].[allall]
set @bi=0

while @t is not null begin
  set @sql='SELECT @i=count(*) FROM [Journals].[dbo].[allall'+ @t +']'
  exec sp_executesql @sql, N'@i int OUTPUT', @i=@i OUTPUT
  set @bi=@bi+@i
  set @t=(select min(TRSTIME) FROM [Journals].[dbo].[allall] WHERE TRSTIME>@t)
end

select @bi
23 янв 12, 15:51    [11953389]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет записей во множестве одинаковых таблиц  [new]
Sergey3999
Member

Откуда:
Сообщений: 13
ZOOKABAKODER,

спасибо, но ух как сложно, честно!

а как ввести логин, пароль к базе

и далее

если так:
User='sa';password='password';"

[String]$strSrv = 'AVTOURAGAN';
[String]$strDB = 'JOURNALS';

[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | Out-Null

[Microsoft.SqlServer.Management.Smo.Server]$objSrv `
= New-Object `
-TypeName 'Microsoft.SqlServer.Management.Smo.Server' `
-ArgumentList $strSrv
[Microsoft.SqlServer.Management.Common.ServerConnection]$objCnn = $objSrv.ConnectionContext

$objDB = $objSrv.Databases[$strDB];
[Int64]$RowCnt = 0;
$objDB.Tables `
| Where-Object {($_.Schema -eq 'dbo') -and ($_.Name -match '^allall\d+$')} `
| ForEach-Object {$RowCnt += $_.RowCount};
"Всего записей вышло $RowCnt";

$objSrv = $null;
$objCnn.Disconnect();

то в конце вышло :

>> "Всего записей вышло $RowCnt";
>>
Неожиданный токен "Всего" в выражении или инструкции.
строка:10 знак:7
+ "Всего <<<< записей вышло $RowCnt";
+ CategoryInfo : ParserError: (Всего:String) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnexpectedToken

PS C:\Users\Sergey> $objSrv = $null;
PS C:\Users\Sergey> $objCnn.Disconnect();
23 янв 12, 15:52    [11953395]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет записей во множестве одинаковых таблиц  [new]
Sergey3999
Member

Откуда:
Сообщений: 13
aleks2,

Вы похоже победитель!!!

Скрипт запустился, идет подсчет, посмотрим.
Отвечу сразу как закончится,
спасибо.

Всем, кому интересно, отработаю все варианты.
23 янв 12, 15:55    [11953438]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет записей во множестве одинаковых таблиц  [new]
Sergey3999
Member

Откуда:
Сообщений: 13
2 aleks2 !!!!!!

за 6 минут 53 сек. подсчитано 27 563 212 записей!!!

однако!

Будете в Миассе обращайтесь обязательно помогу!

Еще раз огромное спасибо!
23 янв 12, 16:05    [11953558]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет записей во множестве одинаковых таблиц  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6201
Раз уж
Sergey3999
Всем, кому интересно, отработаю все варианты

то не поленитесь попробовать варианты с sys.dm_db_partition_stats, которые вам привели выше. Не нужно насиловать сервер count'ом, когда есть более щадящие (и, соответственно, более быстрые) варианты.
23 янв 12, 17:05    [11954163]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет записей во множестве одинаковых таблиц  [new]
ZOOKABAKODER
Member

Откуда:
Сообщений: 178
Sergey3999
ZOOKABAKODER,
спасибо, но ух как сложно, честно!

Да там за пару дней можно во всём разобраться, мануал очень хороший.

Sergey3999
а как ввести логин, пароль к базе

Вторым и третьим параметром конструктора Smo.Server. Ну или как-то так:
[String]$strSrv = '<имя сервака суда>';
[String]$strDB = '<имя бд суда>';
[String]$strUser = '<ну ты понял>';
[String]$strPassword = '';

[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | Out-Null

[Microsoft.SqlServer.Management.Smo.Server]$objSrv `
	= New-Object `
		-TypeName 'Microsoft.SqlServer.Management.Smo.Server' `
		-ArgumentList $strSrv
[Microsoft.SqlServer.Management.Common.ServerConnection]$objCnn = $objSrv.ConnectionContext

$objCnn.Disconnect();
$objCnn.Login = $strUser;
$objCnn.Password = $strPassword;
$objCnn.Connect();

$objDB = $objSrv.Databases[$strDB];
[Int64]$RowCnt = 0;
$objDB.Tables `
	| Where-Object {($_.Schema -eq 'dbo') -and ($_.Name -match '^allall\d+$')} `
	| ForEach-Object {$RowCnt += $_.RowCount};
"Всего записей вышло $RowCnt" | Write-Host;

$objSrv = $null;
$objCnn.Disconnect();


автор
если так:
User='sa';password='password';"

Неа не так. :)

автор
>> "Всего записей вышло $RowCnt";
>>
Неожиданный токен "Всего" в выражении или инструкции.
строка:10 знак:7
+ "Всего <<<< записей вышло $RowCnt";
+ CategoryInfo : ParserError: (Всего:String) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnexpectedToken

Сохрани в файл *.ps1 и запусти этот файл в Powershell и будет тебе счастье.
23 янв 12, 18:59    [11955418]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет записей во множестве одинаковых таблиц  [new]
Sergey3999
Member

Откуда:
Сообщений: 13
ZOOKABAKODER,

извините задержался с ответом,
увы не получилось

PS C:\Users\Sergey> [String]$strSrv = 'AVTOURAGAN';
[String]$strDB = 'Journals';
[String]$strUser = 'sa';
[String]$strPassword = '---------';

[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | Out-Null

[Microsoft.SqlServer.Management.Smo.Server]$objSrv `
= New-Object `
-TypeName 'Microsoft.SqlServer.Management.Smo.Server' `
-ArgumentList $strSrv
[Microsoft.SqlServer.Management.Common.ServerConnection]$objCnn = $objSrv.ConnectionContext

$objCnn.Disconnect();
$objCnn.Login = $strUser;
$objCnn.Password = $strPassword;
$objCnn.Connect();

$objDB = $objSrv.Databases[$strDB];
[Int64]$RowCnt = 0;
$objDB.Tables `
| Where-Object {($_.Schema -eq 'dbo') -and ($_.Name -match '^allall\d+$')} `
| ForEach-Object {$RowCnt += $_.RowCount};
"Всего записей вышло $RowCnt" | Write-Host;

$objSrv = $null;
$objCnn.Disconnect();
New-Object : Не удается найти тип [Microsoft.SqlServer.Management.Smo.Server]: убедитесь в том, что сборка, содержащая этот тип, загружена.
строка:9 знак:14
+ = New-Object <<<< `
+ CategoryInfo : InvalidType: (:) [New-Object], PSArgumentException
+ FullyQualifiedErrorId : TypeNotFound,Microsoft.PowerShell.Commands.NewObjectCommand

Невозможно найти тип [Microsoft.SqlServer.Management.Common.ServerConnection]: убедитесь в том, что сборка, содержащая этот тип, загружена.
строка:12 знак:57
+ [Microsoft.SqlServer.Management.Common.ServerConnection] <<<< $objCnn = $objSrv.ConnectionContext
+ CategoryInfo : InvalidOperation: (Microsoft.SqlSe...erverConnection:String) [], RuntimeException
+ FullyQualifiedErrorId : TypeNotFound

Нельзя вызвать метод для выражения со значением NULL.
строка:14 знак:19
+ $objCnn.Disconnect <<<< ();
+ CategoryInfo : InvalidOperation: (Disconnect:String) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull

Не удается найти свойство "Login" для данного объекта; убедитесь в том, что оно существует и является устанавливаемым.
строка:15 знак:9
+ $objCnn. <<<< Login = $strUser;
+ CategoryInfo : InvalidOperation: (Login:String) [], RuntimeException
+ FullyQualifiedErrorId : PropertyNotFound

Не удается найти свойство "Password" для данного объекта; убедитесь в том, что оно существует и является устанавливаемым.
строка:16 знак:9
+ $objCnn. <<<< Password = $strPassword;
+ CategoryInfo : InvalidOperation: (Password:String) [], RuntimeException
+ FullyQualifiedErrorId : PropertyNotFound

Нельзя вызвать метод для выражения со значением NULL.
строка:17 знак:16
+ $objCnn.Connect <<<< ();
+ CategoryInfo : InvalidOperation: (Connect:String) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull

Не удается индексировать в массив NULL.
строка:19 знак:28
+ $objDB = $objSrv.Databases[ <<<< $strDB];
+ CategoryInfo : InvalidOperation: (Journals:String) [], RuntimeException
+ FullyQualifiedErrorId : NullArray

Всего записей вышло 0
Нельзя вызвать метод для выражения со значением NULL.
строка:27 знак:19
+ $objCnn.Disconnect <<<< ();
+ CategoryInfo : InvalidOperation: (Disconnect:String) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull

Вроде windows 7 SP1 professional, запускал через Windows PowerShell ISE,
толи чего-то не хватает в системе?
24 янв 12, 14:30    [11960432]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет записей во множестве одинаковых таблиц  [new]
Sergey3999
Member

Откуда:
Сообщений: 13
invm,

выдало

автор
Msg 156, Level 15, State 1, Line 1
Incorrect syntax near the keyword 'with'.


попытался понять, не хватает знаний
24 янв 12, 14:51    [11960701]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет записей во множестве одинаковых таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
Sergey3999
На сервере MS SQL 2000,

Sergey3999
выдало

автор
Msg 156, Level 15, State 1, Line 1
Incorrect syntax near the keyword 'with'.


попытался понять, не хватает знаний

В SQL 2000 такогот синтаксиса еще не было
24 янв 12, 14:54    [11960730]     Ответить | Цитировать Сообщить модератору
 Re: Подсчет записей во множестве одинаковых таблиц  [new]
Sergey3999
Member

Откуда:
Сообщений: 13
Сон Веры Павловны,

С удовольствием попытаюсь, но повторяю не хватает знаний,
попробую вспомнить, то что забыл.

но тупо запуская скрипт, получаю

Invalid object name 'sys.dm_db_partition_stats'.
24 янв 12, 14:54    [11960732]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить