This page has moved to our new blog at SQLdbCopy Tech.

Different SQL Server statements need to be performed depending on what version of SQL Server you are running. Below are some of the statements used in SQLdbCopy to perform specific tasks, both for SQL Server and Visual Basic with Visual Studio 2005.

Sql Server 2000 Version 8
Sql Server 2005 Version 9
Sql Server 2008 Version 10

OleDB Provider statement for Access Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};  [{0} = Full Filename]
.Net Date/Time Formatting MM/dd/yyyy HH:mm:ss
.Net List of SQL Servers Dim dt As DataTable = SqlDataSourceEnumerator.Instance.GetDataSources
2000 List Databases SELECT * FROM dbo.sysdatabases;
2005 List Databases SELECT * FROM sys.sysdatabases;
2000 List Tables SELECT u.name AS SchemaName, o.name AS TableName , SUM(CASE WHEN (c.status & 0x80 = 0x80) THEN 1 ELSE 0 END) AS SetIdentity FROM sysobjects AS o INNER JOIN sysusers AS u ON o.uid = u.uid INNER JOIN syscolumns AS c ON o.id = c.id WHERE (o.xtype = 'U') AND (o.name NOT LIKE 'dtproperties') AND (o.name NOT LIKE 'tmp%') AND (o.name NOT LIKE 'sys%') GROUP BY u.name, o.name ORDER BY u.name, o.name;
2005 List Tables SELECT s.name AS SchemaName, t.name AS TableName, SUM(CASE WHEN (c.is_identity = 1) THEN 1 ELSE 0 END) AS SetIdentity FROM sys.tables AS t INNER JOIN sys.schemas AS s ON t.schema_id = s.schema_id INNER JOIN sys.columns AS c on t.object_id = c.object_id WHERE (t.type = 'U') AND (t.name NOT LIKE 'dtproperties') AND (t.name NOT LIKE 'tmp%') AND (t.name NOT LIKE 'sys%') GROUP BY s.name, t.name ORDER BY s.name, t.name;
2000 List Primary Key SELECT u.name AS SchemaName, t.name AS TableName, ix.name AS IndexName, ik.keyno AS ColumnNum, c.name AS ColumnName FROM dbo.sysobjects AS t INNER JOIN dbo.sysindexes AS ix ON t.id = ix.id INNER JOIN dbo.sysindexkeys AS ik ON ix.id = ik.id AND ix.indid = ik.indid INNER JOIN dbo.syscolumns AS c ON ik.id = c.id AND ik.colid = c.colid INNER JOIN dbo.sysusers AS u ON t.uid = u.uid WHERE ((ix.status & 2048) <> 0) AND (u.name = '{0}') AND (t.name = '{1}') ORDER BY t.name, ix.name, ik.keyno;  [{0}=SchemaName, {1}=TableName]
2005 List Primary Key SELECT s.name AS SchemaName, t.name AS TableName, ix.name AS IndexName, ic.index_column_id AS ColumnNum, c.name AS ColumnName FROM sys.tables AS t INNER JOIN sys.indexes AS ix ON t.object_id = ix.object_id INNER JOIN sys.index_columns AS ic ON ix.object_id = ic.object_id AND ix.index_id = ic.index_id INNER JOIN sys.columns AS c ON ic.object_id = c.object_id AND ic.column_id = c.column_id INNER JOIN sys.schemas AS s ON t.schema_id = s.schema_id WHERE (ix.is_primary_key = 1) AND (s.name = '{0}') AND (t.name = '{1}') ORDER BY t.name, ix.name, ic.index_column_id;  [{0}=SchemaName, {1}=TableName]
2000 List Columns SELECT u.name AS SchemaName, t.name AS TableName, c.colid AS ColumnID, c.name AS ColumnName, dt.name AS DataType, c.length AS MaxLength, c.prec AS ColumnPrec, c.scale AS ColumnScale FROM dbo.syscolumns AS c INNER JOIN dbo.sysobjects AS t ON c.id = t.id INNER JOIN dbo.systypes AS dt On c.xusertype = dt.xusertype INNER JOIN dbo.sysusers AS u ON t.uid = u.uid WHERE (u.name = '{0}') AND (t.name = '{1}') AND (dt.name NOT LIKE 'sys%') ORDER BY t.name, c.colid;  [{0}=SchemaName, {1}=TableName]
2005 List Columns SELECT s.name AS SchemaName, t.name AS TableName, c.column_id AS ColumnID, c.name AS ColumnName, dt.name AS DataType, c.max_length AS MaxLength, c.precision AS ColumnPrec, c.scale AS ColumnScale FROM sys.tables AS t INNER JOIN sys.columns AS c ON t.object_id = c.object_id INNER JOIN sys.schemas AS s ON t.schema_id = s.schema_id INNER JOIN sys.types AS dt ON c.system_type_id = dt.user_type_id WHERE (s.name = '{0}') AND (t.name = '{1}') AND (dt.name NOT LIKE 'sys%') ORDER BY t.name, c.column_id;  [{0}=SchemaName, {1}=TableName]

We have added a SetIdentity field in the "List Tables" code to identify tables that have a column with "IDENTITY" set. This allows us to identify which tables need "SET IDENTITY_INSERT [schemaname].[tablename] On/Off" statements when inserting data.

For Access Database output, we currently process the following SQL data types and what ADO format we convert them to. If a character (adVarWChar) based field is larger then 255 characters, it will be converted to an Access Memo (adLongVarWChar) field.

SQL Type DataTypeEnum Procedure Type OleDbType
char adVarWChar TEXT VarWChar
nchar adVarWChar TEXT VarWChar
text adLongVarWChar MEMO LongVarWChar
ntext adLongVarWChar MEMO LongVarWChar
varchar adVarWChar TEXT VarWChar
nvarchar adVarWChar TEXT VarWChar
bigint adNumeric NUMERIC Numeric
int adInteger LONG Integer
smallint adSmallInt INTEGER SmallInt
tinyint adUnsignedTinyInt NUMERIC UnsignedTinyInt
bit adBoolean BIT Boolean
decimal adNumeric NUMERIC Numeric
numeric adNumeric NUMERIC Numeric
money adCurrency CURRENCY Currency
smallmoney adCurrency CURRENCY Currency
float adDouble DOUBLE Double
real adDouble DOUBLE Double
date adDate DATE Date
datetime adDate DATE Date
smalldatetime adDate DATE Date
binary adLongVarBinary BINARY LongVarBinary
varbinary adLongVarBinary LONGBINARY LongVarBinary
image adLongVarBinary LONGBINARY LongVarBinary
timestamp adVarBinary BINARY VarBinary
uniqueidentifier adGUID GUID Guid
cursor not translated
sql_variant not translated
table not translated
xml adLongVarWChar MEMO LongVarWChar