@DBCOLUMNFLAGS_ISLONG = 0x80, @DBCOLUMNFLAGS_ISROWVER = 0x0200 declare @DBTYPE_I2 smallint, @DBTYPE_I4 smallint, @DBTYPE_R4 smallint, @DBTYPE_R8 smallint, @DBTYPE_CY smallint, @DBTYPE_DATE smallint, @DBTYPE_BSTR smallint, @DBTYPE_BOOL smallint, @DBTYPE_VARNUMERIC smallint, @DBTYPE_DECIMAL smallint, @DBTYPE_UI1 smallint, @DBTYPE_BYREF smallint, @DBTYPE_I1 smallint, @DBTYPE_UI2 smallint, @DBTYPE_UI4 smallint, @DBTYPE_I8 smallint, @DBTYPE_UI8 smallint, @DBTYPE_GUID smallint, @DBTYPE_BYTES smallint, @DBTYPE_STR smallint, @DBTYPE_WSTR smallint, @DBTYPE_NUMERIC smallint, @DBTYPE_DBDATE smallint, @DBTYPE_DBTIME smallint, @DBTYPE_DBTIMESTAMP smallint select @DBTYPE_I2 = 2, @DBTYPE_I4 = 3, @DBTYPE_R4 = 4, @DBTYPE_R8 = 5, @DBTYPE_CY = 6, @DBTYPE_DATE = 7, @DBTYPE_BSTR = 8, @DBTYPE_BOOL = 11, @DBTYPE_VARNUMERIC = 139, @DBTYPE_DECIMAL = 14, @DBTYPE_UI1 = 17, @DBTYPE_BYREF = 16384, @DBTYPE_I1 = 16, @DBTYPE_UI2 = 18, @DBTYPE_UI4 = 19, @DBTYPE_I8 = 20, @DBTYPE_UI8 = 21, @DBTYPE_GUID = 72, @DBTYPE_BYTES = 128, @DBTYPE_STR = 129, @DBTYPE_WSTR = 130, @DBTYPE_NUMERIC = 131, @DBTYPE_DBDATE = 133, @DBTYPE_DBTIME = 134, @DBTYPE_DBTIMESTAMP = 135 declare @ODS_SMALLINT_NOT_NULL tinyint, @ODS_INT_NULL tinyint, @ODS_INT_NOT_NULL tinyint, @ODS_TINYINT_NOT_NULL tinyint, @ODS_REAL_NOT_NULL tinyint, @ODS_FLOAT_NULL tinyint, @ODS_FLOAT_NOT_NULL tinyint, @ODS_MONEY_NULL tinyint, @ODS_MONEY_NOT_NULL tinyint, @ODS_DATETIME_NULL tinyint, @ODS_DATETIME_NOT_NULL tinyint, @ODS_TEXT tinyint, @ODS_BIT tinyint, @ODS_DECIMAL tinyint, @ODS_NUMERIC tinyint, @ODS_GUID tinyint, @ODS_IMAGE tinyint, @ODS_TIMESTAMP tinyint, @ODS_BINARY_NULL tinyint, @ODS_BINARY_NOT_NULL tinyint, @ODS_VARBINARY tinyint, @ODS_CHAR_NULL tinyint, @ODS_CHAR_NOT_NULL tinyint, @ODS_VARCHAR tinyint select @ODS_IMAGE = 34, @ODS_TEXT = 35, @ODS_GUID = 36, @ODS_BINARY_NULL = 37, @ODS_VARBINARY = 37, @ODS_INT_NULL = 38, @ODS_CHAR_NULL = 39, @ODS_VARCHAR = 39, @ODS_TIMESTAMP = 45, @ODS_BINARY_NOT_NULL = 45, @ODS_CHAR_NOT_NULL = 47, @ODS_TINYINT_NOT_NULL = 48, @ODS_BIT = 50, @ODS_SMALLINT_NOT_NULL = 52, @ODS_INT_NOT_NULL = 56, @ODS_REAL_NOT_NULL = 59, @ODS_MONEY_NOT_NULL = 60, @ODS_DATETIME_NOT_NULL = 61, @ODS_FLOAT_NOT_NULL = 62, @ODS_DECIMAL = 106, @ODS_NUMERIC = 108, @ODS_FLOAT_NULL = 109, @ODS_MONEY_NULL = 110, @ODS_DATETIME_NULL = 111 declare @ODBC_GUID smallint, @ODBC_NTEXT smallint, @ODBC_NVARCHAR smallint, @ODBC_NCHAR smallint, @ODBC_BIT smallint, @ODBC_TINYINT smallint, @ODBC_IMAGE smallint, @ODBC_VARBINARY smallint, @ODBC_TIMESTAMP smallint, @ODBC_BINARY smallint, @ODBC_TEXT smallint, @ODBC_CHAR smallint, @ODBC_NUMERIC smallint, @ODBC_DECIMAL smallint, @ODBC_MONEY smallint, @ODBC_INT smallint, @ODBC_SMALLINT smallint, @ODBC_FLOAT smallint, @ODBC_REAL smallint, @ODBC_VARCHAR smallint, @ODBC_DATETIME smallint select @ODBC_GUID = -11, @ODBC_NTEXT = -10, @ODBC_NVARCHAR = -9, @ODBC_NCHAR = -8, @ODBC_BIT = -7, @ODBC_TINYINT = -6, @ODBC_IMAGE = -4, @ODBC_VARBINARY = -3, @ODBC_TIMESTAMP = -2, @ODBC_BINARY = -2, @ODBC_TEXT = -1, @ODBC_CHAR = 1, @ODBC_NUMERIC = 2, @ODBC_DECIMAL = 3, @ODBC_MONEY = 3, @ODBC_INT = 4, @ODBC_SMALLINT = 5, @ODBC_FLOAT = 6, @ODBC_REAL = 7, @ODBC_VARCHAR = 12, @ODBC_DATETIME = case @ODBCVer when 2 then 11 else 93 end create table #tmp_columns ( TABLE_CAT sysname NULL, TABLE_SCHEM sysname NULL, TABLE_NAME sysname NOT NULL, COLUMN_NAME sysname NULL, DATA_TYPE smallint NOT NULL, TYPE_NAME sysname NULL, COLUMN_SIZE int NULL, BUFFER_LENGTH int NULL, DECIMAL_DIGITS smallint NULL, NUM_PREC_RADIX smallint NULL, NULLABLE smallint NOT NULL, REMARKS nvarchar(255) NULL, COLUMN_DEF nvarchar(128) NULL, SQL_DATA_TYPE smallint null, SQL_DATETIME_SUB smallint NULL, CHAR_OCTET_LENGTH int NULL, ORDINAL_POSITION smallint, IS_NULLABLE varchar(254) NOT NULL, SS_DATA_TYPE tinyint null, COLUMN_FLAGS int NOT NULL) if ((isnull(charindex('%', @table_name),0) = 0) and (isnull(charindex('[', @table_name),0) = 0) and (isnull(charindex('_', @table_name),0) = 0)) begin /* If no wild carding */ insert into #tmp_columns select TABLE_CAT = c.TABLE_CATALOG, TABLE_SCHEM = c.TABLE_SCHEMA, TABLE_NAME = c.TABLE_NAME, COLUMN_NAME = c.COLUMN_NAME, DATA_TYPE = case c.DATA_TYPE & ~@DBTYPE_BYREF when @DBTYPE_I2 then @ODBC_SMALLINT when @DBTYPE_I4 then @ODBC_INT when @DBTYPE_R4 then @ODBC_REAL when @DBTYPE_R8 then @ODBC_FLOAT when @DBTYPE_CY then @ODBC_MONEY when @DBTYPE_DATE then @ODBC_DATETIME when @DBTYPE_DBDATE then @ODBC_DATETIME when @DBTYPE_DBTIME then @ODBC_DATETIME when @DBTYPE_DBTIMESTAMP then @ODBC_DATETIME when @DBTYPE_BOOL then @ODBC_BIT when @DBTYPE_DECIMAL then @ODBC_DECIMAL when @DBTYPE_UI1 then @ODBC_TINYINT when @DBTYPE_I1 then @ODBC_NUMERIC when @DBTYPE_UI2 then @ODBC_NUMERIC when @DBTYPE_UI4 then @ODBC_NUMERIC when @DBTYPE_I8 then @ODBC_NUMERIC when @DBTYPE_UI8 then @ODBC_NUMERIC when @DBTYPE_NUMERIC then @ODBC_NUMERIC when @DBTYPE_VARNUMERIC then @ODBC_NUMERIC when @DBTYPE_GUID then @ODBC_GUID when @DBTYPE_BYTES then case when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG ) or (p.COLUMN_SIZE > 8000) then @ODBC_IMAGE when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISROWVER) = @DBCOLUMNFLAGS_ISROWVER AND (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH) = @DBCOLUMNFLAGS_ISFIXEDLENGTH and p.COLUMN_SIZE = 8 then @ODBC_TIMESTAMP when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH) then @ODBC_BINARY else @ODBC_VARBINARY end when @DBTYPE_STR then case when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG ) or (p.COLUMN_SIZE > 8000) then @ODBC_TEXT when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH) then @ODBC_CHAR else @ODBC_VARCHAR end when @DBTYPE_WSTR then case when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG) or (p.COLUMN_SIZE > 4000) then @ODBC_NTEXT when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH) then @ODBC_NCHAR else @ODBC_NVARCHAR end when @DBTYPE_BSTR then case when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISLONG = @DBCOLUMNFLAGS_ISLONG) or (p.COLUMN_SIZE > 4000) then @ODBC_NTEXT when (c.COLUMN_FLAGS & @DBCOLUMNFLAGS_ISFIXEDLENGTH = @DBCOLUMNFLAGS_ISFIXEDLENGTH) then @ODBC_NCHAR else @ODBC_NVARCHAR end else @ODBC_NVARCHAR /* Unknown OleDB datatype */ end, TYPE_NAME = p.TYPE_NAME, COLUMN_SIZE = COALESCE(c.CHARACTER_MAXIMUM_LENGTH, c.NUMERIC_PRECISION, p.COLUMN_SIZE), BUFFER_LENGTH = c.CHARACTER_OCTET_LENGTH, DECIMAL_DIGITS = c.NUMERIC_SCALE, NUM_PREC_RADIX = NULL, NULLABLE = convert(smallint, c.IS_NULLABLE), REMARKS = convert(nvarchar(255),c.DESCRIPTION), COLUMN_DEF = c.COLUMN_DEFAULT, SQL_DATA_TYPE = NULL, SQL_DATETIME_SUB = convert(smallint, c.DATETIME_PRECISION), CHAR_OCTET_LENGTH = c.CHARACTER_OCTET_LENGTH, ORDINAL_POSITION = c.ORDINAL_POSITION, IS_NULLABLE = case c.IS_NULLABLE when 1 then 'YES' else 'NO' end, SS_DATA_TYPE = NULL, COLUMN_FLAGS = c.COLUMN_FLAGS from master.dbo.SYSREMOTE_COLUMNS < @table_server, @table_catalog, NULL, @table_name, NULL > c, master.dbo.SYSREMOTE_PROVIDER_TYPES < @table_server > p /* LUXOR/KAGERA don't support restricting DATA_TYPE */ where c.DATA_TYPE = p.DATA_TYPE AND p.BEST_MATCH = 1 and (TABLE_SCHEMA like @table_schema or @table_schema is NULL or (TABLE_SCHEMA is NULL and @table_schema = N'%')) and (c.COLUMN_NAME like @column_name or @column_name is NULL) end else begin /* If wild carding */ insert into #tmp_columns select TABLE_CAT = c.TABLE_CATALOG, TABLE_SCHEM = c.TABLE_SCHEMA, TABLE_NAME = c.TABLE_NAME, COLUMN_NAME = c.COLUMN_NAME, DATA_TYPE = case c.DATA_TYPE & ~@DBTYPE_BYREF when @DBTYPE_I2 then @ODBC_SMALLINT when @DBTYPE_I4 then @ODBC_INT when @DBTYPE_R4 then @ODBC_REAL when @DBTYPE_R8 then @ODBC_FLOAT when @DBTYPE_CY then @ODBC_MONEY when @DBTYPE_DATE then @ODBC_DATETIME when @DBTYPE_DBDATE then @ODBC_DATETIME when @DBTYPE_DBTIME then @ODBC_DATETIME when @DBTYPE_DBTIMESTAMP then @ODBC_DATETIME when @DBTYPE_BOOL then @ODBC_BIT when @DBTYPE_DECIMAL then @ODBC_DECIMAL when @DBTYPE_UI1 then @ODBC_TINYINT when @DBTYPE_I1 then @ODBC_NUMERIC when @DBTYPE_UI2 then @ODBC_NUMERIC when @DBTYPE_UI4 then @ODBC_NUMERIC when @DBTYPE_I8 then @ODBC_NUMERIC when @DBTYPE_UI8 then @ODBC_NUMERIC when @DBTYPE_NUMERIC then @ODBC_NUMERIC whe