1. 程式人生 > >java 通過儲存過程名字 獲取儲存過程的引數列表,然後自動傳參呼叫sp

java 通過儲存過程名字 獲取儲存過程的引數列表,然後自動傳參呼叫sp

實現思路:關鍵點在 通過儲存過程的名字獲取引數列表

資料庫選擇sql server 2012

查詢的指令碼是(注意要指定對應的資料庫,如:使用 use test  或者 test.sys.parameters   test.dbo.sysobjects):

select * from sys.parameters where object_id =object_id('test_sp')

或者
select * from syscolumns where id =(select id from sysobjects where name='test_sp')

想要獲取更多的資訊,需要了解sysobjects,syscolumns,sys.parameters這些檢視各欄位的含義。
select p.object_id,p.name,p.parameter_id,p.user_type_id,s.name,p.max_length
from sys.parameters p
left join sys.types s on p.user_type_id = s.user_type_id
where object_id in( object_id('test_sp1'))

結果:

sysobjects 表 

  在資料庫內建立的每個物件(約束、預設值、日誌、規則、儲存過程等)在表中佔一行。只有在 tempdb 內,每個臨時物件才在該表中佔一行。

  sysobjects 表結構:

列名 資料型別 描述
name sysname 物件名,常用列
id int 物件標識號
xtype char(2) 物件型別。常用列。xtype可以是下列物件型別中的一種: 
C = CHECK 約束  D = 預設值或 DEFAULT 約束  F = FOREIGN KEY 約束  L = 日誌  FN = 標量函式 
IF = 內嵌表函式   P = 儲存過程   PK = PRIMARY KEY 約束(型別是 K)   RF = 複製篩選儲存過程 
 S = 系統表   TF = 表函式   TR = 觸發器   U = 使用者表   UQ = UNIQUE 約束(型別是 K) 
V = 檢視   X = 擴充套件儲存過程
uid smallint 所有者使用者物件編號
info smallint 保留。僅限內部使用
status int 保留。僅限內部使用
base_schema_ ver int 保留。僅限內部使用
 replinfo  int 保留。供複製使用
 parent_obj  int  父物件的物件標識號(例如,對於觸發器或約束,該標識號為表 ID)。
 crdate  datetime  物件的建立日期。
 ftcatid  smallint  為全文索引註冊的所有使用者表的全文目錄識別符號,對於沒有註冊的所有使用者表則為 0
 schema_ver  int  版本號,該版本號在每次表的架構更改時都增加。
 stats_schema_ ver  int  保留。僅限內部使用。
type char(2)   物件型別。可以是下列值之一: 
 C = CHECK 約束   D = 預設值或 DEFAULT 約束 F = FOREIGN KEY 約束 
 FN = 標量函式 IF = 內嵌表函式  K = PRIMARY KEY 或 UNIQUE 約束 
 L = 日誌 P = 儲存過程 R = 規則  RF = 複製篩選儲存過程 
S = 系統表  TF = 表函式 TR = 觸發器 U = 使用者表 V = 檢視 X = 擴充套件儲存過程
 userstat smallint   保留。
 sysstat smallint   內部狀態資訊
 indexdel  smallint  保留
 refdate  datetime  留用
 version int   保留
deltrig  int   保留
 instrig int   保留
 updtrig int   保留
 seltrig int   保留
 category  int  用於釋出、約束和標識
 cache smallint   保留

你可以用下面的命令列出感興趣的所有物件:

SELECT * FROM sysobjects WHERE xtype = <type of interest>
--例如:檢視檢視
SELECT * FROM sysobjects WHERE xtype = 'V'
判斷資料庫中是否已經存在某個表,有的話就刪除該表
--方法一:
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[表名]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[表名]

--方法二:
if exists (select * from sysobjects where id = object_id(N'表名') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[表名]

--方法三:
if(Exists(Select * From SysObjects Where xtype='U' And Name='表名')) 
drop table [dbo].[表名]

1、問:object_id(N'表名')中N'代表什麼意思?

答:N'' 代表 Unicode型別.可以支援不同語種的物件名

2、 問:select   *   from   dbo.sysobjects   where   id   =   object_id(N'[dbo].[usertab]')   and   OBJECTPROPERTY(id,   N'IsUserTable')   =   1   
這句中的object_id(N'[dbo].[usertab]')和OBJECTPROPERTY(id,   N'IsUserTable')   =   1   
是什麼意思?

答:object_id(N'[dbo].[usertab]'):是得出系統給表usertab分配的唯一ID   
OBJECTPROPERTY(id,   N'IsUserTable')   =   1   
該物件的屬性是表型別的 objectproperty(id,property)函式的使用,

3、 問:USE master SELECT * FROM ...SysObjects ” ...sysobjects ” -- 三個句點的字首是什麼意思?

答:對資料庫物件名的 Transact-SQL 引用可以是由四部分組成的名稱,格式如下:[ server_name.[[database_name].[owner_name]. | database_name.[owner_name]. | owner_name.] ] object_name

syscolumns 列說明

name sysname 列名或過程引數的名稱。   
  id int 該列所屬的表物件   ID,或與該引數關聯的儲存過程   ID。   
  xtype tinyint systypes   中的物理儲存型別。   
  typestat tinyint 僅限內部使用。   
  xusertype smallint 擴充套件的使用者定義資料型別   ID。   
  length smallint systypes   中的最大物理儲存長度。   
  xprec tinyint 僅限內部使用。   
  xscale tinyint 僅限內部使用。   
  colid smallint 列或引數   ID。   
  xoffset smallint 僅限內部使用。   
  bITpos tinyint 僅限內部使用。   
  reserved tinyint 僅限內部使用。   
  colstat smallint 僅限內部使用。   
  cdefault int 該列的預設值   ID。   
  domain int 該列的規則或   CHECK   約束   ID。   
  number smallint 過程分組時(0   表示非過程項)的子過程號。   
  colorder smallint 僅限內部使用。   
  autoval varbinary(255) 僅限內部使用。   
  offset smallint 該列所在行的偏移量;如果為負,表示可變長度行。   
  status tinyint 用於描述列或引數屬性的點陣圖:   
    
  0x08   =   列允許空值。   
  0x10   =   當新增   varchar   或   varbinary   列時,ANSI   填充生效。保留   varchar   列的尾隨空格,保留   varbinary   列的尾隨零。   
  0x40   =   引數為   OUTPUT   引數。   
  0x80   =   列為標識列。   
    
  type tinyint systypes   中的物理儲存型別。   
  usertype smallint systypes   中的使用者定義資料型別   ID。   
  printfmt varchar(255) 僅限內部使用。   
  prec smallint 該列的精度級別。   
  scale int 該列的小數位數。   
  iscomputed int 表示是否已計算該列的標誌:   
    
  0   =   未計算。   
  1   =   已計算。   
    
  isoutparam int 表示該過程引數是否是輸出引數: 

  1   =   真。   
  0   =   假。   

  isnullable int 表示該列是否允許空值:   

  1   =   真。   
  0   =   假。   

sys.parameters (Transact-SQL)

SQL Server 2008 其他版本

接受引數的物件的每個引數在表中對應一行。如果物件是標量函式,則另有一行說明返回值。該行將有一個值為 0 的 parameter_id

列名

資料型別

說明

object_id

int

此引數所屬物件的 ID。

name

sysname

引數的名稱。在物件中是唯一的。

如果物件是標量函式,則引數名稱為表示返回值的行中的空字串。

parameter_id

int

引數的 ID。在物件中是唯一的。

如果物件是標量函式,則 parameter_id = 0 表示返回值。

system_type_id

tinyint

引數的系統型別的 ID。

user_type_id

int

使用者定義的引數型別的 ID。

若要返回該型別的名稱,請在該列中聯接到 sys.types 目錄檢視。

max_length

smallint

引數的最大長度(位元組)。

如果列資料型別為 varchar(max)nvarchar(max)varbinary(max) 或 xml,則值 = -1。

precision

tinyint

如果引數是基於數值的,則表示引數的精度;否則為 0。

scale

tinyint

如果引數是基於數值的,則表示引數的小數位數;否則為 0。

is_output

bit

1 = 引數為 OUTPUT 或 RETURN;否則為 0。

is_cursor_ref

bit

1 = 引數為遊標引用引數。

has_default_value

bit

1 = 引數具有預設值。

SQL Server 只維護該目錄檢視中的 CLR 物件的預設值;因此,對於 Transact-SQL 物件,此列包含值 0。若要檢視 Transact-SQL 物件中的引數的預設值,請查詢 sys.sql_modules 目錄檢視的 definition 列,或使用OBJECT_DEFINITION 系統函式。

is_xml_document

bit

1 = 內容為完整的 XML 文件。

0 = 內容為文件片段或者該列的資料型別不為 xml

default_value

sql_variant

如果 has_default_value 為 1,則此列的值為該引數的預設值;否則為 NULL。

xml_collection_id

int

如果引數的資料型別為 xml 並且已鍵入 XML,則其值為非零值。此值為包含驗證引數的 XML 架構名稱空間的集合的 ID。

0 = 沒有 XML 架構集合。

is_readonly

int

1 = 引數為 READONLY;否則為 0。