Как мне программно получить доступ к данным о моей базе данных? - PullRequest
0 голосов
/ 21 января 2011

Я хотел бы получить доступ к списку таблиц и для каждой таблицы указать количество строк, используемое дисковое пространство и т. Д. Было бы неплохо получить эти данные и на уровне базы данных.

Как мне сделать это программно?

Ответы [ 4 ]

2 голосов
/ 21 января 2011

Ответ Джейсона выше хорош, но в целом.вы смотрите информационная схема .Также запись в Википедии:

http://en.wikipedia.org/wiki/Information_schema

1 голос
/ 21 января 2011

Вы можете просто открыть соединение и запросить базу данных:

using(var connection = new SqlConnection(connectionString)) {
    connection.Open();
    using(var command = connection.CreateCommand()) {
        command.CommandText = "SELECT * FROM SYS.TABLES";
        using(var reader = command.ExecuteReader()) {
            while(reader.Read()) {
                Console.WriteLine(reader["name"]);
            }
        }
    }
}

Вы можете Google для строк запроса для другой информации, которую вы хотите.

0 голосов
/ 21 января 2011

Этот скрипт не включает имена схем, но получает большую часть информации, которую вы хотите для текущей базы данных. Я уверен, что вы можете адаптировать его к хранимой процедуре.

SET NOCOUNT ON
GO
DECLARE @tblSpaceUsed TABLE
(
    [name] sysname NOT NULL,
    [rows] int NOT NULL,
    [reserved] nvarchar(50) NOT NULL,
    [reservedKB] int NULL,
    [data] nvarchar(50) NOT NULL,
    [dataKB] int NULL,
    [index] nvarchar(50) NOT NULL,
    [indexKB] int NULL,
    [unused] nvarchar(50) NOT NULL,
    [unusedKB] int NULL
)

DECLARE @tableName sysname
DECLARE @tableNames CURSOR

SET @tableNames = CURSOR
FAST_FORWARD
FOR
SELECT DISTINCT
    ss.name + '.' + st.name
FROM 
    sys.tables st
    INNER JOIN
    sys.schemas ss
        ON st.schema_id = ss.schema_id

OPEN @tableNames 
FETCH NEXT FROM @tableNames INTO @tableName

WHILE @@FETCH_STATUS = 0
BEGIN
    INSERT INTO @tblSpaceUsed ([name], [rows], [reserved], [data], [index], [unused]) EXEC sp_spaceused @tableName

    FETCH NEXT FROM @tableNames INTO @tableName
END

CLOSE @tableNames

UPDATE 
    @tblSpaceUsed
SET
    [reservedKB] = CONVERT(int, LEFT([reserved], LEN([reserved]) - 3)),
    [dataKB] = CONVERT(int, LEFT([data], LEN([data]) - 3)),
    [indexKB] = CONVERT(int, LEFT([index], LEN([index]) - 3)),
    [unusedKB] = CONVERT(int, LEFT([unused], LEN([unused]) - 3))

SELECT
    *
FROM
    @tblSpaceUsed
0 голосов
/ 21 января 2011

Создайте SqlConnection для вашей базы данных и откройте соединение.

SqlConnection conn = new SqlConnection("Data Source=Servername;Initial Catalog=Marketing;Integrated Security=SSPI");
conn.Open();

Создайте SqlCommand и присвойте CommandText требуемому значению SQL.

SqlCommand cmd = new SqlCommand("PLACE SQL HERE", conn);

Таблицы и количество строк:

SELECT 
    [TableName] = so.name, 
    [RowCount] = MAX(si.rows) 
FROM 
    sysobjects so, 
    sysindexes si 
WHERE 
    so.xtype = 'U' 
    AND 
    si.id = OBJECT_ID(so.name) 
GROUP BY 
    so.name 
ORDER BY 
    2 DESC

Используемое пространство:

EXEC sp_spaceused 'tablename'
...