闲着没事翻看SQL SERVER自带存储过程时,改编了一下,改成能够直接返回列数。可能这在实际写客户端应用程序时用处不大,大可以用1<>1这种查询一下就OK了。 create procedure sp_getcolumns(@table_namenvarchar(384),
@ColsCnt int output,
@table_ownernvarchar(384) = null,
@table_qualifiersysname = null,
@column_namenvarchar(384) = null,
@ODBCVerint = 2)
AS
DECLARE @full_table_namenvarchar(769)
DECLARE @table_id int
DECLARE @rowcnt bigint /*记录总的行数*/
--DECLARE @hC CURSOR
/*
create table #tempTable(
colIndex bigint NOT NULL
)*/
set @rowcnt=0 --初始化为0
if @ODBCVer <> 3
select @ODBCVer = 2
if @column_name is null /*If column name not supplied, match all */
select @column_name = '%'
if @table_qualifier is not null
begin
if db_name() <> @table_qualifier
begin/* If qualifier doesn't match current database */
raiserror (15250, -1,-1)
return
end
end
if @table_name is null
begin/*If table name not supplied, match all */
select @table_name = '%'
end
if @table_owner is null
begin/* If unqualified table name */
SELECT @full_table_name = quotename(@table_name)
end
else
begin/* Qualified table name */
if @table_owner = ''
begin/* If empty owner name */
SELECT @full_table_name = quotename(@table_owner)
end
else
begin
SELECT @full_table_name = quotename(@table_owner) +
'.' + quotename(@table_name)
end
end
/*Get Object ID */
SELECT @table_id = object_id(@full_table_name)
if ((isnull(charindex('%', @full_table_name),0) = 0) and
(isnull(charindex('[', @table_name),0) = 0) and
(isnull(charindex('[', @table_owner),0) = 0) and
(isnull(charindex('_', @full_table_name),0) = 0) and
@table_id <> 0)
begin
/* this block is for the case where there is no pattern
matching required for the table name */
declare hc CURSOR for SELECT
TABLE_QUALIFIER = convert(sysname,DB_NAME()),
TABLE_OWNER = convert(sysname,USER_NAME(o.uid)),
TABLE_NAME = convert(sysname,o.name),
COLUMN_NAME = convert(sysname,c.name),
d.DATA_TYPE,
convert (sysname,case
when t.xusertype > 255 then t.name
else d.TYPE_NAME collate database_default
end) TYPE_NAME,
convert(int,case
when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */
else OdbcPrec(c.xtype,c.length,c.xprec)
end) "PRECISION",
convert(int,case
when type_name(d.ss_dtype) IN ('numeric','decimal') then/* decimal/numeric types */
OdbcPrec(c.xtype,c.length,c.xprec)+2
else
isnull(d.length, c.length)
end) LENGTH,
SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),
d.RADIX,
NULLABLE = convert(smallint, ColumnProperty (c.id, c.name, 'AllowsNull')),
REMARKS = convert(varchar(254),null),/* Remarks are NULL */
COLUMN_DEF = text,
d.SQL_DATA_TYPE,
d.SQL_DATETIME_SUB,
CHAR_OCTET_LENGTH = isnull(d.length, c.length)+d.charbin,
ORDINAL_POSITION = convert(int,
(
select count(*)
from syscolumns sc
where sc.id = c.id
AND sc.number = c.number
AND sc.colid <= c.colid
)),
IS_NULLABLE = convert(varchar(254),
substring('NO YES',(ColumnProperty (c.id, c.name, 'AllowsNull')*3)+1,3)),
SS_DATA_TYPE = c.type
FROM
sysobjects o,
master.dbo.spt_datatype_info d,
systypes t,
syscolumns c
LEFT OUTER JOIN syscomments m on c.cdefault = m.id
AND m.colid = 1
WHERE
o.id = @table_id
AND c.id = o.id
AND t.xtype = d.ss_dtype
AND c.length = isnull(d.fixlen, c.length)
AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
AND (o.type not in ('P', 'FN', 'TF', 'IF') OR (o.type in ('TF', 'IF') and c.number = 0))
AND isnull(d.AUTO_INCREMENT,0) = isnull(ColumnProperty (c.id, c.name, 'IsIdentity'),0)
AND c.xusertype = t.xusertype
AND c.name like @column_name
ORDER BY 17
open hC
SELECT @@CURSOR_ROWS '列数'
set @ColsCnt=@@CURSOR_ROWS
close hc
deallocate hc
end
else
begin
/* this block is for the case where there IS pattern
matching done on the table name */
if @table_owner is null /*If owner not supplied, match all */
select @table_owner = '%'
declare hc cursor for SELECT
TABLE_QUALIFIER = convert(sysname,DB_NAME()),
TABLE_OWNER = convert(sysname,USER_NAME(o.uid)),
TABLE_NAME = convert(sysname,o.name),
COLUMN_NAME = convert(sysname,c.name),
d.DATA_TYPE,
convert (sysname,case
when t.xusertype > 255 then t.name
else d.TYPE_NAME collate database_default
end) TYPE_NAME,
convert(int,case
when d.DATA_TYPE in (6,7) then d.data_precision /* FLOAT/REAL */
else OdbcPrec(c.xtype,c.length,c.xprec)
end) "PRECISION",
convert(int,case
when type_name(d.ss_dtype) IN ('numeric','decimal') then/* decimal/numeric types */
OdbcPrec(c.xtype,c.length,c.xprec)+2
else
isnull(d.length, c.length)
end) LENGTH,
SCALE = convert(smallint, OdbcScale(c.xtype,c.xscale)),
d.RADIX,
NULLABLE = convert(smallint, ColumnProperty (c.id, c.name, 'AllowsNull')),
REMARKS = convert(varchar(254),null),/* Remarks are NULL */
COLUMN_DEF = text,
d.SQL_DATA_TYPE,
d.SQL_DATETIME_SUB,
CHAR_OCTET_LENGTH = isnull(d.length, c.length)+d.charbin,
ORDINAL_POSITION = convert(int,
(
select count(*)
from syscolumns sc
where sc.id = c.id
AND sc.number = c.number
AND sc.colid <= c.colid
)),
IS_NULLABLE = convert(varchar(254),
rtrim(substring('NO YES',(ColumnProperty (c.id, c.name, 'AllowsNull')*3)+1,3))),
SS_DATA_TYPE = c.type
FROM
sysobjects o,
master.dbo.spt_datatype_info d,
systypes t,
syscolumns c
LEFT OUTER JOIN syscomments m on c.cdefault = m.id
AND m.colid = 1
WHERE
o.name like @table_name
AND user_name(o.uid) like @table_owner
AND o.id = c.id
AND t.xtype = d.ss_dtype
AND c.length = isnull(d.fixlen, c.length)
AND (d.ODBCVer is null or d.ODBCVer = @ODBCVer)
AND (o.type not in ('P', 'FN', 'TF', 'IF') OR (o.type in ('TF', 'IF') and c.number = 0))
AND isnull(d.AUTO_INCREMENT,0) = isnull(ColumnProperty (c.id, c.name, 'IsIdentity'),0)
AND c.xusertype = t.xusertype
AND c.name like @column_name
ORDER BY 2, 3, 17
open hC
SELECT @@CURSOR_ROWS as '列数'
set @ColsCnt=@@CURSOR_ROWS
close hc
deallocate hc
end
-- select @rowcnt as 列数
--select count(*) as 列数 from #tempTable
--drop table #tempTable
Go
--**********************************
declare @num int
exec sp_getcolumns GoodsInTable,@num output
select @num
分享到:
相关推荐
在本案例中,我们将详细探讨如何在SQL Server 2005中进行列转行的操作,特别是通过存储过程来实现。 首先,列转行通常用于处理具有固定列数但列名可能变化的数据。例如,你可能有一个表,其中每个月的销售数据存储...
本文将重点介绍 SQL Server 中一些常用的存储过程,特别是分页查询的经典存储过程。 #### 分页查询存储过程 在实际应用中,当数据量非常大时,我们往往不会一次性获取所有数据,而是采用分页的方式来展示数据。...
SQL Server 索引中 include 的魅力(具有包含性列的索引) SQL Server 索引中 include 的魅力(具有包含性列的索引)是指在非聚集索引中添加非键列,以扩展索引的功能,提高查询性能。通过将非键列添加到非聚集索引...
在SQL Server 2000中,由于没有内置的OFFSET和FETCH NEXT功能,我们通常会使用`TOP`和`ORDER BY`结合`ROW_NUMBER()`函数来实现分页。以下是一个简单的例子: ```sql CREATE PROCEDURE GetPagedData @StartIndex INT...
在SQL Server中,数据存储的基本单位是页(Page),传统的行存储方式将整行数据存储在同一个页中。而列存储方式则是将某一列的数据连续存储在一起,这样可以充分利用数据之间的相似性和冗余性进行高效压缩。因此,...
标题和描述中的SQL查询语句是用于导出SQL Server 2000中特定表的结构。该查询利用了系统表和视图(如`syscolumns`、`systypes`、`sysobjects`等)来收集关于表列的信息,包括列名、数据类型、是否为主键、长度、精度...
在 SQL Server 2000 中,最大容量说明被分为三类:适用于所有版本的通用限制、根据 SQL Server 版本和操作系统不同的特定限制以及针对特定功能的限制。以下是对这些限制的详细解释: #### 一、适用于所有版本的通用...
【存储过程】是SQL Server数据库管理系统中的一个重要特性,它类似于编程语言中的函数,可以执行一系列预定义的SQL语句和管理任务。存储过程能够提高系统的效率、安全性,并且支持模块化程序设计,使得代码重用变得...
根据提供的标题、描述、标签及部分内容,本文将详细介绍SQL中实现列转行及行转列通用存储过程的具体方法,特别是针对Microsoft SQL Server版本的应用场景。 ### 标题解析:SQL列转行及行转列的通用存储过程 该标题...
SQL Server 分页存储过程是一种在数据库中实现高效数据分页查询的方法。在大型数据集的展示中,分页是必不可少的,因为它允许用户逐步浏览数据,而不是一次性加载所有记录,从而提高用户体验并减少服务器负载。以下...
### SQL Server系统存储过程全局变量解析 在SQL Server中,全局变量是一类特殊的变量,它们由系统维护,用于存储和返回关于SQL Server运行时状态的信息。这些变量无需声明即可使用,且其值不能被用户直接修改。全局...
在本文中,我们将详细介绍 SQL Server 2005 的各种限制,这些限制涵盖了数据库引擎对象、数据表、索引、列、行、字符串、连接、锁、存储过程、触发器、用户定义函数、分区表、索引、统计信息等方面。 数据库引擎...
本文将深入探讨一个针对 SQL Server 2000 的通用分页存储过程。该存储过程采用 `TOP + MAX(ID)` 的方法实现分页功能,并强调了关键字(`Keyword`)选择对于性能的影响。 #### 存储过程设计 此存储过程名为 `p_...
本文将详细介绍如何使用存储过程实现SQL Server的分页,并演示如何在代码中调用这些存储过程。 一、分页的基本原理 分页通常涉及到两个关键参数:每页大小(PageSize)和当前页码(CurrentPage)。通过这两个参数...
本文将深入探讨如何利用SQL Server的存储过程实现高效的大数据分页查询。 首先,理解分页查询的基本概念。分页查询是指从海量数据中按指定的页码和每页大小获取数据,通常用于网页展示或报表生成。在SQL Server中,...
首先,我们来看看SQL Server中的分页存储过程。这里展示的是一个名为`usp_GetPageData`的存储过程,用于获取分页数据。这个存储过程接收三个参数:`@pageSize`(每页记录数),`@pageIndex`(当前页数),以及`@...
【SQL Server 2000】作为一款历史悠久的数据库管理系统,是Microsoft公司推出的早期版本,为用户提供了数据存储、查询和管理的平台。本篇文档深入浅出地介绍了数据库的基础知识,涵盖了从基本概念到实际应用的多个...
根据提供的文件信息,我们可以从标题、描述以及部分文本中提炼出关于SQL Server 2000的相关知识点。以下是对这些信息的详细解析: ### 标题:SQL Server 2000编程员指南 该标题明确指出这是一本针对SQL Server ...
在SQL Server 2008中,数据存储和数据类型的改进是主要的亮点,这些更新旨在提高数据库性能、节省存储空间以及支持更多样化的数据类型。 首先,让我们深入了解一下数据存储的改进。SQL Server 2008引入了两种新的...
在SQL Server 2000中,数据库编程主要涉及对数据类型的理解和操作,以及如何创建、插入和查询数据表。以下是对给定文件中提到的一些关键知识点的详细解释: 1. **数据类型**: - **字符数据类型**:包括`char`, `...