SQL Server查询表结构

来源:http://yangrenjun.javaeye.com/blog/611937

SELECT DISTINCT sysobjects.name, syscolumns.colid,syscolumns.name, systypes.name, syscolumns.prec, syscolumns.scale
FROM syscolumns, sysobjects, systypes
WHERE sysobjects.id = syscolumns.id AND systypes.type = syscolumns.type AND ((sysobjects.type='u'))

在应用SQL Server的基于客户机/服务器体系结构的信息系统开发中,
有时需 要将后台SQL Server上的某一数据库的表结构都打印出来,
以便于开发人员查阅及最终文档的形成。SQL Server本身提供了一个系统存储过程 (SP_COLUMNS),
可以完成对单个表结构的查询,只要在SQL Server的ISQL-W工具中键入SP_COLUMNS “表名”,
并 执行即 可得到结果集。但该方法有许多不足之处,其主要缺点是:
1) 只能对单表进行操作,当需要查询一个数据库中所有的表时,需要多次执行SP_COLUMNS ,因此显得非常繁琐。
2) 查询结果集中包含了许多不必要的信息。
下面我们创建一个存储过程来完成对某一个数据库中所有表结构的查询。
在创建一个数据库的同 时,系统会自动建立一些系统表,限于篇幅的缘故我们在这里只介绍与应用实例有关的三个系统表 (SYSOBJECTS,SYSCOLUMNS,SYSTYPES)及其相关的字段。
表SYSOBJECTS为数据库内创建的每个对象(约 束,规则,表,视图,触发器等)创建一条记录。
该表相关字段的含义如下:
SYSOBJECTS.name 对象名,如:表名,视图名。
SYSOBJECTS.id 对象id。
SYSOBJECTS.type 对象类型(p存储过程,v视图,s系统表,u用户表)。
表SYSCOLUMNS 为每个表、视图中的每个列和每个存储过程的每个参数创建一条记录。
该表相关字段的含义如下:(此处的列系指数据库中每个表、视图中的列)
SYSCOLUMNS. id 该列所属的表的id,可与SYSOBJECTS.id相关联
SYSCOLUMNS.colid 列id,表示该列是表或视图的第几列。
SYSCOLUMNS.type 物理存储类型,可与SYSTYPES.type相关联。
SYSCOLUMNS.length 数据的物理长度。
SYSCOLUMNS.name 列名字,即字段名。
SYSCOLUMNS .Pre 列的精度级。
SYSCOLUMNS .Scale 列的标度级。
表SYSTYPES 为每个系统和每个用户提供的数据类型创建一条记录,如果它们存在,给定域和默认值,描述系统提供的数据类型的行不可更改。
该表相关字段的含义 如下:
SYSTYPES.name 数据类型的名字。
SYSTYPES.type 物理存储数据类型。
在SQL SERVER的企业管理器(SQL ENTERPRISE MANAGER)中,选定某一数据库,创建存储过程print_dbstructure。
源代码如下:
if exists (select * from sysobjects where id = object_id('dbo. print_dbstructure
') and sysstat & 0xf = 4)

存储过程
drop procedure dbo. print_dbstructure

GO
CREATE PROCEDURE print_dbstructure

AS
SELECT DISTINCT sysobjects.name, syscolumns.colid,
syscolumns.name, systypes.name, syscolumns.prec, syscolumns.scale
FROM syscolumns, sysobjects, systypes
WHERE sysobjects.id = syscolumns.id AND systypes.type = syscolumns.type AND ((sysobjects.type='u'))

GO
首先判断是否存在一 个名为print_dbstructure的存储过程,如果存在,就摘除它,否则,定义SQL语句建立新的存储过程。从三个系统表中选出满足条件的记录 (即该数据库中保存在系统表中的用户表信息)。
执行时,在ISQL_W工具中,选定print_dbstructure所在的数据库,执行该 存储过程,即可得到结果集(即该数据库中用户表的结构信息)。

SQL Server系统表的推广应用

以上所介绍存储过程的主要缺陷在于只能对服务器上某一特定的数据库(print_dbstructure所在的数据库)进行查询操作,
我们 可以通过在SQL Server系统数据库MASTER中建立带有数据库名参数的系统存储过程来解决这一问题

SQL Server查询表结构

来源:http://yangrenjun.javaeye.com/blog/611937

SELECT DISTINCT sysobjects.name, syscolumns.colid,syscolumns.name, systypes.name, syscolumns.prec, syscolumns.scale
    FROM syscolumns, sysobjects, systypes
    WHERE sysobjects.id = syscolumns.id AND systypes.type = syscolumns.type AND ((sysobjects.type='u'))
在应用SQL Server的基于客户机/服务器体系结构的信息系统开发中,
    有时需 要将后台SQL Server上的某一数据库的表结构都打印出来,
    以便于开发人员查阅及最终文档的形成。SQL Server本身提供了一个系统存储过程 (SP_COLUMNS),
    可以完成对单个表结构的查询,只要在SQL Server的ISQL-W工具中键入SP_COLUMNS “表名”,
    并 执行即 可得到结果集。但该方法有许多不足之处,其主要缺点是:
    1) 只能对单表进行操作,当需要查询一个数据库中所有的表时,需要多次执行SP_COLUMNS ,因此显得非常繁琐。
    2) 查询结果集中包含了许多不必要的信息。
    下面我们创建一个存储过程来完成对某一个数据库中所有表结构的查询。
    在创建一个数据库的同 时,系统会自动建立一些系统表,限于篇幅的缘故我们在这里只介绍与应用实例有关的三个系统表 (SYSOBJECTS,SYSCOLUMNS,SYSTYPES)及其相关的字段。
    表SYSOBJECTS为数据库内创建的每个对象(约 束,规则,表,视图,触发器等)创建一条记录。
    该表相关字段的含义如下:
    SYSOBJECTS.name 对象名,如:表名,视图名。
    SYSOBJECTS.id 对象id。
    SYSOBJECTS.type 对象类型(p存储过程,v视图,s系统表,u用户表)。
    表SYSCOLUMNS 为每个表、视图中的每个列和每个存储过程的每个参数创建一条记录。
    该表相关字段的含义如下:(此处的列系指数据库中每个表、视图中的列)
    SYSCOLUMNS. id 该列所属的表的id,可与SYSOBJECTS.id相关联
    SYSCOLUMNS.colid 列id,表示该列是表或视图的第几列。
    SYSCOLUMNS.type 物理存储类型,可与SYSTYPES.type相关联。
    SYSCOLUMNS.length 数据的物理长度。
    SYSCOLUMNS.name 列名字,即字段名。
    SYSCOLUMNS .Pre 列的精度级。
    SYSCOLUMNS .Scale 列的标度级。
    表SYSTYPES 为每个系统和每个用户提供的数据类型创建一条记录,如果它们存在,给定域和默认值,描述系统提供的数据类型的行不可更改。
    该表相关字段的含义 如下:
    SYSTYPES.name 数据类型的名字。
    SYSTYPES.type 物理存储数据类型。
    在SQL SERVER的企业管理器(SQL ENTERPRISE MANAGER)中,选定某一数据库,创建存储过程print_dbstructure。
    源代码如下:
    if exists (select * from sysobjects where id = object_id('dbo. print_dbstructure
    ') and sysstat & 0xf = 4)
存储过程
    drop procedure dbo. print_dbstructure
GO
    CREATE PROCEDURE print_dbstructure
AS
    SELECT DISTINCT sysobjects.name, syscolumns.colid,
    syscolumns.name, systypes.name, syscolumns.prec, syscolumns.scale
    FROM syscolumns, sysobjects, systypes
    WHERE sysobjects.id = syscolumns.id AND systypes.type = syscolumns.type AND ((sysobjects.type='u'))
GO
    首先判断是否存在一 个名为print_dbstructure的存储过程,如果存在,就摘除它,否则,定义SQL语句建立新的存储过程。从三个系统表中选出满足条件的记录 (即该数据库中保存在系统表中的用户表信息)。
    执行时,在ISQL_W工具中,选定print_dbstructure所在的数据库,执行该 存储过程,即可得到结果集(即该数据库中用户表的结构信息)。
SQL Server系统表的推广应用
以上所介绍存储过程的主要缺陷在于只能对服务器上某一特定的数据库(print_dbstructure所在的数据库)进行查询操作,
    我们 可以通过在SQL Server系统数据库MASTER中建立带有数据库名参数的系统存储过程来解决这一问题

一个判断能否远程连接MySQL主机的方法

如果无法连接:

D:\phpnow\MySQL-5.0.83\bin>mysql -h111.111.111.111-utest -ptest
ERROR 2003 (HY000): Can't connect to MySQL server on '111.111.111.111' (10061)

如果可以连接

D:\phpnow\MySQL-5.0.83\bin>mysql -h111.111.111.111-utest -ptest
ERROR 1045 (28000): Access denied for user 'test'@'111.111.111.111' (using password: YES)

MySQL追加(附加)字符串到表中某text字段的所有行

上次说了SQL Server追加(附加)字符串到表中某text字段的所有行,那么对于MySQL该如何操作呢,其实远比SQLServer简单,根本用不到游标,需要一个函数:concat(),用法:

CONCAT(str1,str2,…)
返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。或许有一个或多个参数。 如果所有参数均为非二进制字符串,则结果为非二进制字符串。 如果自变量中含有任一二进制字符串,则结果为一个二进制字符串。一个数字参数被转化为与之相等的二进制字符串格式;若要避免这种情况,可使用显式类型 cast, 例如: SELECT CONCAT(CAST(int_col AS CHAR), char_col)

mysql> SELECT CONCAT(‘My’, ‘S’, ‘QL’);

-> ‘MySQL’

mysql> SELECT CONCAT(‘My’, NULL, ‘QL’);

-> NULL

mysql> SELECT CONCAT(14.3);

-> ‘14.3’

所以我们的语句可以是:

update table1 set field1=concat(field1,'str u wanna append');

SQL Server追加(附加)字符串到表中某text字段的所有行

text类型的字段不能像varchar一样直接通过’+’运算符来附加,需要使用updatetext语句,下面是一个实例:

declare @p binary(16),@c1 varchar(8000)
set @c1='待附加的字符串'
declare 表名 cursor local
for
select textptr(字段名),@c1
from 表名
open 表名
fetch 表名 into @p,@c1
while @@fetch_status=0
begin
    UPDATETEXT 表名.字段名 @p null 0 @c1
    fetch 表名 into @p,@c1
end
close 表名
deallocate 表名
GO

SQL Server 中的dbo是什么意思?

DBO是每个数据库的默认用户,具有所有者权限,即DbOwner

通过用DBO作为所有者来定义对象,能够使数据库中的任何用户引用而不必提供所有者名称。

比如:你以User1登录进去并建表Table,而未指定DBO,

当用户User2登进去想访问Table时就得知道这个Table是你User1建立的,要写上User1.Table,如果他不知道是你建的,则访问会有问题。

如果你建表时把所有者指给了Dbo,则别的用户进来时写上Dbo.Table就行了,不必知道User1。

不光表是如此,视图等等数据库对象建立时也要如此才算是好。

建表、存储过程、视图等数据库对象时,其对应的所有者是创建它的用户。则除了该用户其他登录用户要引用这些东东时,都要加上前缀,很是麻烦。而且,程序因此易出错,你查来查去问题确出在这,浪费你时间。

来源