Please start any new threads on our new
site at https://forums.sqlteam.com. We've got lots of great SQL Server
experts to answer whatever question you can come up with.
Author |
Topic |
noblemfd
Starting Member
38 Posts |
Posted - 2012-06-28 : 18:26:59
|
am developing an application with VB6 and MSSQL 2000. 1. I want to create a form so that when the form loads, it will display all the database in the MSSQL 2000 and also the tables in each of the database.2. I want to use ListBox to display all the database, and use ListView to display the tables.The ListView should have checkbox.3. It should be that when a database is clicked on the ListBox, it should display the corresponding tables in that database on the ListView.4. Then I should be able to clean up (empty the table) any of the selected table.Please help me out. |
|
tkizer
Almighty SQL Goddess
38200 Posts |
|
noblemfd
Starting Member
38 Posts |
|
sidestepper
Starting Member
3 Posts |
Posted - 2012-08-09 : 21:48:06
|
Not so certain about using VB, but I've done this sort of thing for our web based tools at my company with C#. But most of the magic is in making a stored procedure(Which we use SQL 2008, but it may work in 2000).I know this post is from June, but if you're still looking, maybe this stored procedure will help:CREATE PROCEDURE [dbo].[DescribeDatabase] @databaseName varchar(50), @objectId varchar(50) = null, @objectName varchar(50) = null, @returnDataRows int = nullASBEGIN declare @exists int = ( select COUNT(*) from master..sysdatabases where name = @databaseName ) if(@exists = 1) begin declare @sql varchar(1000) if(@objectId is not null) begin create table #tempTables ([name] varchar(50), [object_id] varchar(50)) set @sql = 'insert into #tempTables ([name], [object_id]) select [name], [object_id] from ' + @databaseName + '.sys.tables' execute (@sql) declare @tableExists int = ( select COUNT(*) from #tempTables where [object_id] = @objectId ) if(@tableExists = 1) begin set @sql = 'USE ' + @databaseName + ' ' + 'SELECT sysobjects.name [TableName], ' + ' syscolumns.name [ColumnName], ' + ' systypes.name [ColumnType], ' + ' ( ' + ' CASE ' + ' WHEN syscolumns.length = -1 ' + ' THEN systypes.length ' + ' ELSE syscolumns.length ' + ' END ' + ' ) as [ColumnLength], ' + ' ( ' + ' CASE ' + ' WHEN syscolumns.length = -1 ' + ' THEN ''1'' ' + ' ELSE ''0'' ' + ' END ' + ' ) as [IsMax], ' + ' syscolumns.length [ColumnLength], ' + ' ( ' + ' CASE ' + ' WHEN syscolumns.[id] in ( ' + ' select [id] ' + ' from sysobjects ' + ' where name = ''' + @objectName + ''' ) and ' + ' colid in ( ' + ' select SIK.colid ' + ' from sysindexkeys SIK ' + ' JOIN sysobjects SYSO on SIK.[id] = SYSO.[id] ' + ' where SIK.indid = 1 and SYSO.[name] = ''' + @objectName + ''' ) ' + ' THEN ''1'' ' + ' ELSE ''0'' ' + ' END ' + ' ) as [IsPrimaryKey] ' + 'FROM sysobjects ' + ' JOIN syscolumns ON sysobjects.id = syscolumns.id ' + ' JOIN systypes ON syscolumns.xtype=systypes.xtype ' + 'WHERE sysobjects.xtype=''U'' and sysobjects.id = ' + @objectId + ' and systypes.name <> ''sysname'' ' + 'ORDER BY sysobjects.name,syscolumns.colid' execute (@sql) end drop table #tempTables -- Asking for set of data rows as well if(@returnDataRows is not null and @objectName is not null) begin set @sql = 'USE ' + @databaseName + ' ' + 'SELECT * ' + 'FROM ' + @databaseName + '..' + @objectName execute (@sql) end end else begin set @sql = 'select * from ' + @databaseName + '.sys.tables order by name' execute (@sql) end endEND Now, to use it, first call with just the database name you want:exec dbo.DescribeDatabase @databaseName='MyDatabase' From that list you can then have your application capture the object id's and names, and use them to call the procedure again with different arguments to drill down into the various tables:exec dbo.DescribeDatabase @databaseName='MyDatabase', @objectId='17492234', @objectName='CustomersTable' Hope this helps! |
|
|
Webtalk
Starting Member
2 Posts |
Posted - 2012-10-11 : 00:49:54
|
Thanks, I was searching all over the web for this functionality!unspammed |
|
|
noblemfd
Starting Member
38 Posts |
Posted - 2013-05-27 : 22:31:28
|
What I mean is User Defined databas(e.g. aslCadbury) and tables(e.g. tblEmployee, tblCustomer, tblInvoices), not system database.quote: Originally posted by sidestepper Not so certain about using VB, but I've done this sort of thing for our web based tools at my company with C#. But most of the magic is in making a stored procedure(Which we use SQL 2008, but it may work in 2000).I know this post is from June, but if you're still looking, maybe this stored procedure will help:CREATE PROCEDURE [dbo].[DescribeDatabase] @databaseName varchar(50), @objectId varchar(50) = null, @objectName varchar(50) = null, @returnDataRows int = nullASBEGIN declare @exists int = ( select COUNT(*) from master..sysdatabases where name = @databaseName ) if(@exists = 1) begin declare @sql varchar(1000) if(@objectId is not null) begin create table #tempTables ([name] varchar(50), [object_id] varchar(50)) set @sql = 'insert into #tempTables ([name], [object_id]) select [name], [object_id] from ' + @databaseName + '.sys.tables' execute (@sql) declare @tableExists int = ( select COUNT(*) from #tempTables where [object_id] = @objectId ) if(@tableExists = 1) begin set @sql = 'USE ' + @databaseName + ' ' + 'SELECT sysobjects.name [TableName], ' + ' syscolumns.name [ColumnName], ' + ' systypes.name [ColumnType], ' + ' ( ' + ' CASE ' + ' WHEN syscolumns.length = -1 ' + ' THEN systypes.length ' + ' ELSE syscolumns.length ' + ' END ' + ' ) as [ColumnLength], ' + ' ( ' + ' CASE ' + ' WHEN syscolumns.length = -1 ' + ' THEN ''1'' ' + ' ELSE ''0'' ' + ' END ' + ' ) as [IsMax], ' + ' syscolumns.length [ColumnLength], ' + ' ( ' + ' CASE ' + ' WHEN syscolumns.[id] in ( ' + ' select [id] ' + ' from sysobjects ' + ' where name = ''' + @objectName + ''' ) and ' + ' colid in ( ' + ' select SIK.colid ' + ' from sysindexkeys SIK ' + ' JOIN sysobjects SYSO on SIK.[id] = SYSO.[id] ' + ' where SIK.indid = 1 and SYSO.[name] = ''' + @objectName + ''' ) ' + ' THEN ''1'' ' + ' ELSE ''0'' ' + ' END ' + ' ) as [IsPrimaryKey] ' + 'FROM sysobjects ' + ' JOIN syscolumns ON sysobjects.id = syscolumns.id ' + ' JOIN systypes ON syscolumns.xtype=systypes.xtype ' + 'WHERE sysobjects.xtype=''U'' and sysobjects.id = ' + @objectId + ' and systypes.name <> ''sysname'' ' + 'ORDER BY sysobjects.name,syscolumns.colid' execute (@sql) end drop table #tempTables -- Asking for set of data rows as well if(@returnDataRows is not null and @objectName is not null) begin set @sql = 'USE ' + @databaseName + ' ' + 'SELECT * ' + 'FROM ' + @databaseName + '..' + @objectName execute (@sql) end end else begin set @sql = 'select * from ' + @databaseName + '.sys.tables order by name' execute (@sql) end endEND Now, to use it, first call with just the database name you want:exec dbo.DescribeDatabase @databaseName='MyDatabase' From that list you can then have your application capture the object id's and names, and use them to call the procedure again with different arguments to drill down into the various tables:exec dbo.DescribeDatabase @databaseName='MyDatabase', @objectId='17492234', @objectName='CustomersTable' Hope this helps!
|
|
|
noblemfd
Starting Member
38 Posts |
Posted - 2013-05-27 : 22:33:42
|
What I mean is User Defined databas(e.g. aslCadbury) and tables(e.g. tblEmployee, tblCustomer, tblInvoices), not system database.quote: Originally posted by sidestepper Not so certain about using VB, but I've done this sort of thing for our web based tools at my company with C#. But most of the magic is in making a stored procedure(Which we use SQL 2008, but it may work in 2000).I know this post is from June, but if you're still looking, maybe this stored procedure will help:CREATE PROCEDURE [dbo].[DescribeDatabase] @databaseName varchar(50), @objectId varchar(50) = null, @objectName varchar(50) = null, @returnDataRows int = nullASBEGIN declare @exists int = ( select COUNT(*) from master..sysdatabases where name = @databaseName ) if(@exists = 1) begin declare @sql varchar(1000) if(@objectId is not null) begin create table #tempTables ([name] varchar(50), [object_id] varchar(50)) set @sql = 'insert into #tempTables ([name], [object_id]) select [name], [object_id] from ' + @databaseName + '.sys.tables' execute (@sql) declare @tableExists int = ( select COUNT(*) from #tempTables where [object_id] = @objectId ) if(@tableExists = 1) begin set @sql = 'USE ' + @databaseName + ' ' + 'SELECT sysobjects.name [TableName], ' + ' syscolumns.name [ColumnName], ' + ' systypes.name [ColumnType], ' + ' ( ' + ' CASE ' + ' WHEN syscolumns.length = -1 ' + ' THEN systypes.length ' + ' ELSE syscolumns.length ' + ' END ' + ' ) as [ColumnLength], ' + ' ( ' + ' CASE ' + ' WHEN syscolumns.length = -1 ' + ' THEN ''1'' ' + ' ELSE ''0'' ' + ' END ' + ' ) as [IsMax], ' + ' syscolumns.length [ColumnLength], ' + ' ( ' + ' CASE ' + ' WHEN syscolumns.[id] in ( ' + ' select [id] ' + ' from sysobjects ' + ' where name = ''' + @objectName + ''' ) and ' + ' colid in ( ' + ' select SIK.colid ' + ' from sysindexkeys SIK ' + ' JOIN sysobjects SYSO on SIK.[id] = SYSO.[id] ' + ' where SIK.indid = 1 and SYSO.[name] = ''' + @objectName + ''' ) ' + ' THEN ''1'' ' + ' ELSE ''0'' ' + ' END ' + ' ) as [IsPrimaryKey] ' + 'FROM sysobjects ' + ' JOIN syscolumns ON sysobjects.id = syscolumns.id ' + ' JOIN systypes ON syscolumns.xtype=systypes.xtype ' + 'WHERE sysobjects.xtype=''U'' and sysobjects.id = ' + @objectId + ' and systypes.name <> ''sysname'' ' + 'ORDER BY sysobjects.name,syscolumns.colid' execute (@sql) end drop table #tempTables -- Asking for set of data rows as well if(@returnDataRows is not null and @objectName is not null) begin set @sql = 'USE ' + @databaseName + ' ' + 'SELECT * ' + 'FROM ' + @databaseName + '..' + @objectName execute (@sql) end end else begin set @sql = 'select * from ' + @databaseName + '.sys.tables order by name' execute (@sql) end endEND Now, to use it, first call with just the database name you want:exec dbo.DescribeDatabase @databaseName='MyDatabase' From that list you can then have your application capture the object id's and names, and use them to call the procedure again with different arguments to drill down into the various tables:exec dbo.DescribeDatabase @databaseName='MyDatabase', @objectId='17492234', @objectName='CustomersTable' Hope this helps!
|
|
|
|
|
|
|
|