您好,我是小DAI,专注于数据库管理员相关的技术问答,请问有什么可以帮您?

sp_autoformat

说明

一种用于生成可读结果集数据的实用程序存储过程,sp_autoformat 将重新设置长度可变的字符数据的宽度格式,以便只显示非空字符。输出中将截断尾随空白。

语法


sp_autoformat <fulltabname>[, <selectlist>, <whereclause>, <orderby>]

参数

<fulltabname>

指定从中选择数据的表的名称。如果对象所有者不是运行该命令的用户,请使用所有者名称。

<selectlist>

指定要从结果集中选择的以逗号分隔的列列表。使用 <name> = <column> 符号可对表中的列重命名。请参见示例。如果未提供 <selectlist>,则所指定表中的所有列都将以列 ID 顺序输出。

<whereclause>

是搜索谓词,被指定为 where 子句,用于从选定的表中过滤行。

<orderby>

是可选的 order by 子句,用于指定输出结果集的显示顺序。

示例

示例 1

从类似 select id, colid, name from syscolumns where id = 3 的 select 语句返回结果集(其中字符列的格式将自动设置):


1> sp_autoformat "syscolumns", "id, colid, name", "where id = 3"
2> go

id           colid  name
------------ ------ ----------- 
           3      1 id
           3      2 number
           3      3 colid
           3      4 status
           3      5 type
           3      6 length
           3      7 offset
           3      8 usertype
           3      9 cdefault
           3     10 domain
           3     11 name
           3     12 printfmt
           3     13 prec
           3     14 scale
           3     15 remote_type
           3     16 remote_name
           3     17 xstatus
           3     18 xtype
           3     19 xdbid
           3     21 accessrule
           3     22 status2

示例 2

使用下列语法重命名输出列:


[ <AS-Name label of Column> ][ ]*=[ ]*<column name>

<AS-Name label of Column> 是可选的,可在 = 分隔符两侧使用空格:
1> sp_autoformat syscolumns, "'Object Id' = id, 'Column Name'=name, 
     'Column ID'=colid", "where id = 3"
2> go

 Object Id   Column Name Column ID 
------------ ----------- --------- 
           3 id                  1 
           3 number              2 
           3 colid               3 
           3 status              4 
           3 type                5 
           3 length              6 
           3 offset              7 
           3 usertype            8 
           3 cdefault            9 
           3 domain             10 
           3 name               11 
           3 printfmt           12 
           3 prec               13 
           3 scale              14 
           3 remote_type        15 
           3 remote_name        16 
           3 xstatus            17 
           3 xtype              18 
           3 xdbid              19 
           3 accessrule         21 
           3 status2            22 

(1 row affected)

示例 3

使用 <orderby> 参数可以指定结果输出中的顺序:


sp_autoformat @fulltabname = 'syscolumns',
              @selectlist = "id, name",
              @orderby = "ORDER BY name"

示例 4

要在从多个表中选择时生成自动设置格式的结果,或者如果 select 列表中的表达式具有复杂的 SQL select 语句,则必须:

使用临时表生成结果集:

下列命令将生成在所有系统目录中具有最高列 ID 的列的列表:


select o.id, o.name, c.colid, c.name
from sysobjects o, syscolumns c
where o.id < 100 and o.id = c.id
  and c.colid = (select max(c2.colid) from syscolumns c2
                where c2.id = c.id)
order by o.name

下列命令可生成自动设置了字符数据格式的相同结果集,并使用临时表来生成可读输出,其中还包括微小的更改,以便在临时表中提供列名:


select o.id, ObjectName = o.name, c.colid, ColumnName = c.name
into #result
from sysobjects o, syscolumns c
where o.id < 100 and o.id = c.id
  and c.colid = (select max(c2.colid) from syscolumns c2
                 where c2.id = c.id)

对临时表使用 sp_autoformat 可生成格式化的输出:


1> exec sp_autoformat @fulltabname = #result, @orderby = "order by 
   ObjectName"
2> go

id       ObjectName        colid ColumnName
-------- ----------------- ------ -------------
      11 sysalternates         2 altsuid 
      21 sysattributes        13 comments 
      55 syscertificates       6 suid 
      45 syscharsets           8 sortfile 
       3 syscolumns           22 status2 
       6 syscomments           8 status 
      37 sysconfigures         9 value4 
      17 sysconstraints        7 spare2 
      38 syscurconfigs        15 type 
      30 sysdatabases         19 status4 
      12 sysdepends           10 readobj 
      35 sysdevices            7 mirrorname 
      43 sysengines           12 starttime 

      ...

(1 row affected)
(return status = 0)

生成临时表时将跳过原始 select 语句中的 order by 子句,而在生成输出结果时会将该子句添加到对 sp_autoformat 的调用中

可对临时表进行进一步处理,以便只报告对选定表的必需输出,如下所示:


1> exec sp_autoformat #result, "id, 'Object Name' = ObjectName, 
   'Column Name' = ColumnName", "where id < 5"
2> go

id      Object Name Column Name 
------- ----------- ----------- 
      1 sysobjects  loginame
      2 sysindexes  crdate
      3 syscolumns  status2
      4 systypes    accessrule

用法

  • 在 SAP ASE 15.0.3 版和更高版本中,sp_autoformat 接受数据类型为 int(smallint、bigint、tinyint、unsignedint)numeric、money、date/time 以及 float、real 和 double precision 的列。

  • sp_autoformat 只查找当前数据库中的对象。若要对临时表使用 sp_autoformat,请从 tempdb 发出该过程。

  • sp_autoformat 不会验证各个参数所引用的列是否实际存在于 <fulltabname> 参数指定的表中。如果引用了任何不存在的列,sp_autoformat 将失败。

  • 只在 select 列表中提供一个列的实例。

    返回代码包括:

  • 0 成功完成

  • 1 内部错误,或在调用中出现使用错误

  • 其它 在执行生成的 SQL 语句时,由 SAP ASE 服务器引发的所有其它错误都将返回给调用方。

    sp_autoformat 的限制为:

  • sp_autoformat 使用内部 SQL 变量来生成 SQL 语句,然后使用 execute immediate 执行该语句。生成的 SQL 语句的长度限制为 2K 字节。用于较大列列表的自动格式化结果集或名称较长的列有时会因为缓冲区大小对于生成的 SQL 语句而言不够充足而引发错误。

  • 表或列名称不支持带引号的标识符。如果您的结果集使用带引号的标识符或者需要自动设置格式,则应当:

  1. 在临时表中生成所需数据,其中临时表中的列没有带引号的标识符。

  1. 使用 sp_autoformat 并通过临时表来生成所需输出。

    3.以所需的输出格式对 中的列进行重命名。