--Для того чтобы узнать сколько различных объектов содержит ваша база данных, можно запустить следующий скрипт:
--Для того чтобы узнать сколько различных объектов содержит ваша база данных, можно запустить следующий скрипт:
SELECT 'Системных Таблиц' AS [Name],COUNT([id]) AS [COUNT] , 1 AS [ORDER] FROM [dbo].[sysobjects] WHERE OBJECTPROPERTY([id],'IsSystemTable') = 1
UNION
SELECT 'Таблиц' AS [Name],COUNT([id]) AS [COUNT] , 2 AS [ORDER] FROM [dbo].[sysobjects] WHERE OBJECTPROPERTY([id],'IsTable') = 1
UNION
SELECT 'Пользовательских Таблиц' AS [Name],COUNT([id]) AS [COUNT] , 3 AS [ORDER] FROM [dbo].[sysobjects] WHERE OBJECTPROPERTY([id], 'IsUserTable') =1
UNION
SELECT 'Кол-во таблиц, имеющих индексы',COUNT([id]) , 4 AS [ORDER] FROM [dbo].[sysobjects] WHEREOBJECTPROPERTY([id], 'IsIndexed') = 1
UNION
SELECT 'Кол-во таблиц, которые могут иметь индексы',COUNT([id]) , 5 AS [ORDER] FROM [dbo].[sysobjects] WHERE OBJECTPROPERTY([id],'IsIndexable') = 1
UNION
SELECT 'View',COUNT([id]) , 6 AS [ORDER] FROM[dbo].[sysobjects] WHERE OBJECTPROPERTY([id], 'IsView') = 1
UNION
SELECT 'Триггеров',COUNT([id]) , 7 AS [ORDER] FROM [dbo].[sysobjects] WHEREOBJECTPROPERTY([id], 'IsTrigger') = 1
UNION
SELECT 'Процедур',COUNT([id]) , 8 AS [ORDER] FROM [dbo].[sysobjects] WHEREOBJECTPROPERTY([id], 'IsProcedure') = 1
UNION
SELECT 'Внешних процедур',COUNT([id]) , 9 AS [ORDER] FROM [dbo].[sysobjects] WHEREOBJECTPROPERTY([id], 'IsExtendedProc') = 1
UNION
SELECT 'Правил',COUNT([id]) , 10 AS [ORDER] FROM[dbo].[sysobjects] WHERE OBJECTPROPERTY([id], 'IsRule') = 1
UNION
SELECT 'Default',COUNT([id]) , 11 AS [ORDER] FROM [dbo].[sysobjects]WHERE OBJECTPROPERTY([id], 'IsDefault') = 1
UNION
SELECT 'Ограничений (Check Constraint)',COUNT([id]) , 12 AS [ORDER] FROM [dbo].[sysobjects] WHEREOBJECTPROPERTY([id], 'IsCheckCnst') = 1
UNION
SELECT 'Ограничений (Constraint)',COUNT([id]) , 13 AS [ORDER] FROM [dbo].[sysobjects] WHEREOBJECTPROPERTY([id], 'IsConstraint') = 1
UNION
SELECT 'PrimaryKeys',COUNT([id]) , 14 AS [ORDER] FROM [dbo].[sysobjects]WHERE OBJECTPROPERTY([id], 'IsPrimaryKey') = 1
UNION
SELECT 'Scalar Function',COUNT([id]) , 15 AS [ORDER] FROM [dbo].[sysobjects] WHEREOBJECTPROPERTY([id], 'IsScalarFunction') = 1
UNION
SELECT 'Table Valued Function',COUNT([id]) , 16 AS [ORDER] FROM [dbo].[sysobjects] WHEREOBJECTPROPERTY([id], 'IsTableFunction') = 1
ORDER BY 3
понедельник, 30 августа 2010 г.
SQL Server и ActiveDirectory
Создание подключения к AD
Либо по-простому:
--A little easier way to perform this :-) --Create the linked server EXEC SP_ADDLINKEDSERVER 'ADSI', 'Active Directory Services 2.5','ADSDSOObject', 'adsdatasource' --Create the login account --(change SQL_ACCOUNT_NAME, --NT_ACCOUNT_NAME, PASSSWORD) EXEC SP_ADDLINKEDSRVLOGIN 'ADSI', FALSE, 'SQL_ACCOUNT_NAME','NT_ACCOUNT_NAME', 'PASSWORD' --Execute your query SELECT samAccountName, givenName [FIRST Name], sn [LAST Name],legacyExchangeDN FROM OPENQUERY(ADSI,'SELECT samAccountName, givenName, sn, legacyExchangeDN
FROM ''LDAP://DC=zm,DC=COM''
WHERE objectClass=''Person''
AND objectClass = ''User''') WHERE givenName IS NOT NULL --------------------------------------------------------------------------------- --из других источников SP_ADDLINKEDSERVER 'ADSI', 'Active Directory Services 2.5', 'ADSDSOObject', 'adsdatasource' GO --удалить можно так --if exists(select 1 from master..sysservers where srvname = 'ADSI') exec sp_dropserver 'ADSI', 'droplogins' --CREATE VIEW viewADUsers AS --SELECT * FROM OpenQuery( ADSI,'
;(objectClass=*);givenname,sn, mail, adspath')
IF OBJECT_ID(N'[dbo].vw_ADUsers') IS NOT NULL DROP VIEW [dbo].vw_ADUsers GO -- Create the 'vw_ADUsers' view CREATE VIEW [dbo].vw_ADUsers AS SELECT samaccountname,
givenName,
[description] FROM OPENQUERY( ADSI,
'SELECT samaccountname, givenName,description
FROM ''LDAP://OU=WCC Users,DC=wcc,DC=net''
WHERE objectCategory = ''Person'' AND
objectClass = ''User''') GO SELECT * FROM [dbo].vw_ADUsers
--A little easier way to perform this :-) --Create the linked server EXEC SP_ADDLINKEDSERVER 'ADSI', 'Active Directory Services 2.5','ADSDSOObject', 'adsdatasource' --Create the login account --(change SQL_ACCOUNT_NAME, --NT_ACCOUNT_NAME, PASSSWORD) EXEC SP_ADDLINKEDSRVLOGIN 'ADSI', FALSE, 'SQL_ACCOUNT_NAME','NT_ACCOUNT_NAME', 'PASSWORD' --Execute your query SELECT samAccountName, givenName [FIRST Name], sn [LAST Name],legacyExchangeDN FROM OPENQUERY(ADSI,'SELECT samAccountName, givenName, sn, legacyExchangeDN
FROM ''LDAP://DC=zm,DC=COM''
WHERE objectClass=''Person''
AND objectClass = ''User''') WHERE givenName IS NOT NULL --------------------------------------------------------------------------------- --из других источников SP_ADDLINKEDSERVER 'ADSI', 'Active Directory Services 2.5', 'ADSDSOObject', 'adsdatasource' GO --удалить можно так --if exists(select 1 from master..sysservers where srvname = 'ADSI') exec sp_dropserver 'ADSI', 'droplogins' --CREATE VIEW viewADUsers AS --SELECT * FROM OpenQuery( ADSI,'
IF OBJECT_ID(N'[dbo].vw_ADUsers') IS NOT NULL DROP VIEW [dbo].vw_ADUsers GO -- Create the 'vw_ADUsers' view CREATE VIEW [dbo].vw_ADUsers AS SELECT samaccountname,
givenName,
[description] FROM OPENQUERY( ADSI,
'SELECT samaccountname, givenName,description
FROM ''LDAP://OU=WCC Users,DC=wcc,DC=net''
WHERE objectCategory = ''Person'' AND
objectClass = ''User''') GO SELECT * FROM [dbo].vw_ADUsers
либо по полной в 2008:
/****** Object: LinkedServer [ADSI] Script Date: 11/16/2009 09:33:13 ******/ EXEC master.dbo.SP_ADDLINKEDSERVER @server = N'ADSI', @srvproduct=N'ActiveDirectory2SQL', @provider=N'ADsDSOObject', @datasrc=N'addatasource' /* For security reasons the linked server remote logins password is changed with ######## */ EXEC master.dbo.SP_ADDLINKEDSRVLOGIN @rmtsrvname=N'ADSI',@useself=N'False',@locallogin=NULL,@rmtuser=N'RNTC\rpbd',@rmtpassword='########' GO EXEC master.dbo.SP_SERVEROPTION @server=N'ADSI', @optname=N'collation compatible', @optvalue=N'false' GO EXEC master.dbo.SP_SERVEROPTION @server=N'ADSI', @optname=N'data access', @optvalue=N'true' GO EXEC master.dbo.SP_SERVEROPTION @server=N'ADSI', @optname=N'dist', @optvalue=N'false' GO EXEC master.dbo.SP_SERVEROPTION @server=N'ADSI', @optname=N'pub', @optvalue=N'false' GO EXEC master.dbo.SP_SERVEROPTION @server=N'ADSI', @optname=N'rpc', @optvalue=N'false' GO EXEC master.dbo.SP_SERVEROPTION @server=N'ADSI', @optname=N'rpc out', @optvalue=N'false' GO EXEC master.dbo.SP_SERVEROPTION @server=N'ADSI', @optname=N'sub', @optvalue=N'false' GO EXEC master.dbo.SP_SERVEROPTION @server=N'ADSI', @optname=N'connect timeout', @optvalue=N'0' GO EXEC master.dbo.SP_SERVEROPTION @server=N'ADSI', @optname=N'collation name', @optvalue=null
GO EXEC master.dbo.SP_SERVEROPTION @server=N'ADSI', @optname=N'lazy schema validation', @optvalue=N'false' GO EXEC master.dbo.SP_SERVEROPTION @server=N'ADSI', @optname=N'query timeout', @optvalue=N'0' GO EXEC master.dbo.SP_SERVEROPTION @server=N'ADSI', @optname=N'use remote collation', @optvalue=N'true' GO EXEC master.dbo.SP_SERVEROPTION @server=N'ADSI', @optname=N'remote proc transaction promotion', @optvalue=N'true' GO
/****** Object: LinkedServer [ADSI] Script Date: 11/16/2009 09:33:13 ******/ EXEC master.dbo.SP_ADDLINKEDSERVER @server = N'ADSI', @srvproduct=N'ActiveDirectory2SQL', @provider=N'ADsDSOObject', @datasrc=N'addatasource' /* For security reasons the linked server remote logins password is changed with ######## */ EXEC master.dbo.SP_ADDLINKEDSRVLOGIN @rmtsrvname=N'ADSI',@useself=N'False',@locallogin=NULL,@rmtuser=N'RNTC\rpbd',@rmtpassword='########' GO EXEC master.dbo.SP_SERVEROPTION @server=N'ADSI', @optname=N'collation compatible', @optvalue=N'false' GO EXEC master.dbo.SP_SERVEROPTION @server=N'ADSI', @optname=N'data access', @optvalue=N'true' GO EXEC master.dbo.SP_SERVEROPTION @server=N'ADSI', @optname=N'dist', @optvalue=N'false' GO EXEC master.dbo.SP_SERVEROPTION @server=N'ADSI', @optname=N'pub', @optvalue=N'false' GO EXEC master.dbo.SP_SERVEROPTION @server=N'ADSI', @optname=N'rpc', @optvalue=N'false' GO EXEC master.dbo.SP_SERVEROPTION @server=N'ADSI', @optname=N'rpc out', @optvalue=N'false' GO EXEC master.dbo.SP_SERVEROPTION @server=N'ADSI', @optname=N'sub', @optvalue=N'false' GO EXEC master.dbo.SP_SERVEROPTION @server=N'ADSI', @optname=N'connect timeout', @optvalue=N'0' GO EXEC master.dbo.SP_SERVEROPTION @server=N'ADSI', @optname=N'collation name', @optvalue=null
GO EXEC master.dbo.SP_SERVEROPTION @server=N'ADSI', @optname=N'lazy schema validation', @optvalue=N'false' GO EXEC master.dbo.SP_SERVEROPTION @server=N'ADSI', @optname=N'query timeout', @optvalue=N'0' GO EXEC master.dbo.SP_SERVEROPTION @server=N'ADSI', @optname=N'use remote collation', @optvalue=N'true' GO EXEC master.dbo.SP_SERVEROPTION @server=N'ADSI', @optname=N'remote proc transaction promotion', @optvalue=N'true' GO
SELECT * -- , description, FROM OPENQUERY(ADSI, 'select cn,sn, givenname, ou, mail,displayname, samaccountname, distinguishedname, name,
l, title, physicaldeliveryofficename, telephonenumber, department
, company, streetaddress, userprincipalname, manager
, mailnickname, homephone, pager, mobile, postalcode
from ''LDAP://avrora/ DC = rntc, DC = ru''
where objectCategory = ''Person''
order by sn')
l, title, physicaldeliveryofficename, telephonenumber, department
, company, streetaddress, userprincipalname, manager
, mailnickname, homephone, pager, mobile, postalcode
from ''LDAP://avrora/ DC = rntc, DC = ru''
where objectCategory = ''Person''
order by sn')
Перебрать по буквам с A - Z (Т.к. есть ограничение на 1000 записей)
CREATE TABLE #tmpADUsers
( employeeId VARCHAR(10) NULL,
SAMAccountName VARCHAR(255) NOT NULL,
email VARCHAR(255) NULL) GO /* AD is limited to send 1000 records in one batch. In an ADO interface you can define this batch size, not in OPENQUERY.
Because of this limitation, we just loop through the alphabet.
*/ DECLARE @cmdstr VARCHAR(255) DECLARE @nAsciiValue SMALLINT DECLARE @sChar CHAR(1) SELECT @nAsciiValue = 65 WHILE @nAsciiValue < 91 BEGIN SELECT @sChar= CHAR(@nAsciiValue) EXEC master..XP_SPRINTF @cmdstr OUTPUT, 'SELECT employeeId, SAMAccountName, Mail FROM OPENQUERY( ADSI, ''SELECT Mail, SAMAccountName, employeeID FROM ''''LDAP://avrora/ DC = rntc, DC = ru''''WHERE objectCategory = ''''Person'''' AND SAMAccountName = ''''%s*'''''' )', @sChar
INSERT #tmpADUsers
EXEC( @cmdstr ) SELECT @nAsciiValue = @nAsciiValue + 1 END SELECT* FROM #tmpADUsers --DROP TABLE #tmpADUsers
( employeeId VARCHAR(10) NULL,
SAMAccountName VARCHAR(255) NOT NULL,
email VARCHAR(255) NULL) GO /* AD is limited to send 1000 records in one batch. In an ADO interface you can define this batch size, not in OPENQUERY.
Because of this limitation, we just loop through the alphabet.
*/ DECLARE @cmdstr VARCHAR(255) DECLARE @nAsciiValue SMALLINT DECLARE @sChar CHAR(1) SELECT @nAsciiValue = 65 WHILE @nAsciiValue < 91 BEGIN SELECT @sChar= CHAR(@nAsciiValue) EXEC master..XP_SPRINTF @cmdstr OUTPUT, 'SELECT employeeId, SAMAccountName, Mail FROM OPENQUERY( ADSI, ''SELECT Mail, SAMAccountName, employeeID FROM ''''LDAP://avrora/ DC = rntc, DC = ru''''WHERE objectCategory = ''''Person'''' AND SAMAccountName = ''''%s*'''''' )', @sChar
INSERT #tmpADUsers
EXEC( @cmdstr ) SELECT @nAsciiValue = @nAsciiValue + 1 END SELECT* FROM #tmpADUsers --DROP TABLE #tmpADUsers
Или так
SELECT users.sAMAccountName AS userName, objectsid,name,RTRIM(LTRIM(isnull(givenName,'')+' ' +isnull(sn,'')))AS fullname FROM OPENQUERY( ADSI, 'SELECT name, sn,givenName,sAMAccountName,objectsid FROM ''LDAP://DC=madomaine,DC=com'' WHERE objectCategory = ''Person'' AND objectClass= ''user'' AND ( NAME = ''A*'' OR NAME = ''B*'' OR NAME = ''C*'' OR NAME = ''D*'' OR NAME = ''E*'' OR NAME = ''F*'' OR NAME = ''G*'')')AS users UNION SELECT users.sAMAccountName AS userName, objectsid,name,RTRIM(LTRIM(isnull(givenName,'')+' ' +isnull(sn,'')))AS fullname FROM OPENQUERY( ADSI, 'SELECT name, sn,givenName,sAMAccountName,objectsid FROM ''LDAP://DC=madomaine,DC=com'' WHERE objectCategory = ''Person'' AND objectClass= ''user'' AND ( NAME = ''H*'' OR NAME = ''I*'' OR NAME = ''J*'' OR NAME = ''K*'' OR NAME = ''L*'' OR NAME = ''M*'' OR NAME = ''N*'')')AS users UNION SELECT users.sAMAccountName AS userName, objectsid,name,RTRIM(LTRIM(isnull(givenName,'')+' ' +isnull(sn,'')))AS fullname FROM OPENQUERY( ADSI, 'SELECT name, sn,givenName,sAMAccountName,objectsid FROM ''LDAP://DC=madomaine,DC=com'' WHERE objectCategory = ''Person'' AND objectClass= ''user'' AND ( NAME = ''O*'' OR NAME = ''P*'' OR NAME = ''Q*'' OR NAME = ''R*'' OR NAME = ''S*'' OR NAME = ''T*'' OR NAME = ''U*'')')AS users UNION SELECT users.sAMAccountName AS userName, objectsid,name,RTRIM(LTRIM(isnull(givenName,'')+' ' +isnull(sn,'')))AS fullname FROM OPENQUERY( ADSI, 'SELECT name, sn,givenName,sAMAccountName,objectsid FROM ''LDAP://DC=madomaine,DC=com'' WHERE objectCategory = ''Person'' AND objectClass= ''user'' AND ( NAME = ''V*'' OR NAME = ''W*'' OR NAME = ''X*'' OR NAME = ''Y*'' OR NAME = ''Z*'' )') AS users
Нельзя получить поля из АД через SQL
- DESCRIPTION
- POSTOFFICEBOX
- memberOf
Получить описание полей в SQL Server
Получить описание Таблиц
/*To add an extended property*/ SP_ADDEXTENDEDPROPERTY /*To update an extended property*/ SP_UPDATEEXTENDEDPROPERTY /*To delete an extended property*/ SP_DROPEXTENDEDPROPERTY /*To view an extended property*/ FN_LISTEXTENDEDPROPERTY sys.extended_properties -- 2000 SELECT * FROM ::FN_LISTEXTENDEDPROPERTY(NULL, N'user', N'dbo', N'table', N'Area', NULL, NULL) xp --- 2008 SELECT * FROM sys.extended_properties
Cписок полей для 2000
EXEC SP_ADDEXTENDEDPROPERTY 'MS_Description', 'some description', 'user', dbo, 'table', table_name, 'column', column_name SELECT [TABLE Name] = i_s.TABLE_NAME,
[COLUMN Name] = i_s.COLUMN_NAME,
[Description] = s.VALUE FROM INFORMATION_SCHEMA.COLUMNS i_s LEFT OUTER JOIN sysproperties s ON s.id = OBJECT_ID(i_s.TABLE_SCHEMA+'.'+i_s.TABLE_NAME) AND s.smallid = i_s.ORDINAL_POSITION AND s.name = 'MS_Description' WHERE OBJECTPROPERTY(OBJECT_ID(i_s.TABLE_SCHEMA+'.'+i_s.TABLE_NAME), 'IsMsShipped')=0 -- AND i_s.TABLE_NAME = 'table_name' ORDER BY i_s.TABLE_NAME, i_s.ORDINAL_POSITION
[COLUMN Name] = i_s.COLUMN_NAME,
[Description] = s.VALUE FROM INFORMATION_SCHEMA.COLUMNS i_s LEFT OUTER JOIN sysproperties s ON s.id = OBJECT_ID(i_s.TABLE_SCHEMA+'.'+i_s.TABLE_NAME) AND s.smallid = i_s.ORDINAL_POSITION AND s.name = 'MS_Description' WHERE OBJECTPROPERTY(OBJECT_ID(i_s.TABLE_SCHEMA+'.'+i_s.TABLE_NAME), 'IsMsShipped')=0 -- AND i_s.TABLE_NAME = 'table_name' ORDER BY i_s.TABLE_NAME, i_s.ORDINAL_POSITION
Список полей для 2005 и 2008
SELECT [TABLE Name] = OBJECT_NAME(c.OBJECT_ID),
[COLUMN Name] = c.name,
[Description] = ex.VALUE FROM sys.columns c LEFT OUTER JOIN sys.extended_properties ex ON ex.major_id = c.OBJECT_ID AND ex.minor_id = c.column_id AND ex.name = 'MS_Description' WHERE OBJECTPROPERTY(c.OBJECT_ID, 'IsMsShipped')=0 -- AND OBJECT_NAME(c.object_id) = 'your_table' ORDER BY OBJECT_NAME(c.OBJECT_ID), c.column_id
[Description] = ex.VALUE FROM sys.columns c LEFT OUTER JOIN sys.extended_properties ex ON ex.major_id = c.OBJECT_ID AND ex.minor_id = c.column_id AND ex.name = 'MS_Description' WHERE OBJECTPROPERTY(c.OBJECT_ID, 'IsMsShipped')=0 -- AND OBJECT_NAME(c.object_id) = 'your_table' ORDER BY OBJECT_NAME(c.OBJECT_ID), c.column_id
Разные запросы и полезняшки по SQL SERVER
--Информация по серверу
SELECT @@VERSION, SERVERPROPERTY('productversion') productversion, SERVERPROPERTY ('productlevel') productlevel
Способы подсчета количества записей в каждой из таблиц базы данных
--Способ 1: Поскольку приведенный ниже sql-код для подсчета количества записей использует таблицу sysindexes, его результат зависит от того, была ли обновлена статистика.
EXEC sp_msforeachtable 'UPDATE STATISTICS ?'
SELECT SUBSTRING(o.name, 1, 30) Table_Name ,i.ROWS Number_of_Rows
FROM sysobjects o
INNER join sysindexes i
ON (o.id = i.id)
WHERE o.xtype = 'u'
and i.indid < 2
ORDER BY o.name
--Способ 2: Следующий sql-код также может быть использован для определения количества записей в таблицах базы данных. Для подсчета числа строк этот sql-код использует функцию агрегации. Обрамление кавычками выбранного названия таблицы необходимо для обработки пробелов в названии (если такие названия существуют).
SET NOCOUNT ON
DECLARE tables_cursor CURSOR
FOR
SELECT name FROM sysobjects WHERE type = 'U' ORDER BY 1
OPEN tables_cursor
DECLARE @tablename VARCHAR(50)
FETCH NEXT FROM tables_cursor INTO @tablename
WHILE (@@FETCH_STATUS <> -1)
BEGIN
SELECT @tablename = QUOTENAME(@tablename, '[]')
DECLARE @CMD VARCHAR(100)
PRINT @TABLENAME
SELECT @CMD = ' select count(*) from '+@tablename+' '
EXEC (@CMD)
FETCH NEXT FROM tables_cursor INTO @tablename
END
DEALLOCATE tables_cursor
SET NOCOUNT OFF
--Способ 3: Для решения поставленной задачи можно также использовать недокументированную хранимую процедуру sp_Msforeachtable. Sp_Msforeachtable сканирует все таблицы в определенной базе данных и выполняет указанную sql-команду (ы) для каждой из таблиц. Для подстановки имени таблицы используется символ "?".
sp_msforeachtable @command1= 'print ''?''', @command2 = "select count(*) from ?"
SELECT @@VERSION, SERVERPROPERTY('productversion') productversion, SERVERPROPERTY ('productlevel') productlevel
Способы подсчета количества записей в каждой из таблиц базы данных
--Способ 1: Поскольку приведенный ниже sql-код для подсчета количества записей использует таблицу sysindexes, его результат зависит от того, была ли обновлена статистика.
EXEC sp_msforeachtable 'UPDATE STATISTICS ?'
SELECT SUBSTRING(o.name, 1, 30) Table_Name ,i.ROWS Number_of_Rows
FROM sysobjects o
INNER join sysindexes i
ON (o.id = i.id)
WHERE o.xtype = 'u'
and i.indid < 2
ORDER BY o.name
--Способ 2: Следующий sql-код также может быть использован для определения количества записей в таблицах базы данных. Для подсчета числа строк этот sql-код использует функцию агрегации. Обрамление кавычками выбранного названия таблицы необходимо для обработки пробелов в названии (если такие названия существуют).
SET NOCOUNT ON
DECLARE tables_cursor CURSOR
FOR
SELECT name FROM sysobjects WHERE type = 'U' ORDER BY 1
OPEN tables_cursor
DECLARE @tablename VARCHAR(50)
FETCH NEXT FROM tables_cursor INTO @tablename
WHILE (@@FETCH_STATUS <> -1)
BEGIN
SELECT @tablename = QUOTENAME(@tablename, '[]')
DECLARE @CMD VARCHAR(100)
PRINT @TABLENAME
SELECT @CMD = ' select count(*) from '+@tablename+' '
EXEC (@CMD)
FETCH NEXT FROM tables_cursor INTO @tablename
END
DEALLOCATE tables_cursor
SET NOCOUNT OFF
--Способ 3: Для решения поставленной задачи можно также использовать недокументированную хранимую процедуру sp_Msforeachtable. Sp_Msforeachtable сканирует все таблицы в определенной базе данных и выполняет указанную sql-команду (ы) для каждой из таблиц. Для подстановки имени таблицы используется символ "?".
sp_msforeachtable @command1= 'print ''?''', @command2 = "select count(*) from ?"
Подписаться на:
Сообщения (Atom)