查询所有存储过程

--查询所有存储过程
select Pr_Name as [存储过程], [参数]=stuff((select ''+[Parameter]
   
from (
       
select Pr.Name as Pr_Name,parameter.name +' ' +Type.Name + ' ('+convert(varchar(32),parameter.max_length)+')' as Parameter
       
from sys.procedures Pr left join
        sys.parameters parameter
on Pr.object_id = parameter.object_id
       
inner join sys.types Type on parameter.system_type_id = Type.system_type_id
       
where type = 'P'
    ) t
where Pr_Name=tb.Pr_Name for xml path('')), 1, 1, '')
from (
   
select Pr.Name as Pr_Name,parameter.name +' ' +Type.Name + ' ('+convert(varchar(32),parameter.max_length)+')' as Parameter
   
from sys.procedures Pr left join
    sys.parameters parameter
on Pr.object_id = parameter.object_id
   
inner join sys.types Type on parameter.system_type_id = Type.system_type_id
   
where type = 'P'
)tb
where Pr_Name not like 'sp_%' --and Pr_Name not like 'dt%'
group by Pr_Name
order by Pr_Name

--查询所有触发器
select triggers.name as [触发器],tables.name as [表名],triggers.is_disabled as [是否禁用],
triggers.is_instead_of_trigger
AS [触发器类型],
case when triggers.is_instead_of_trigger = 1 then 'INSTEAD OF'
    
when triggers.is_instead_of_trigger = 0 then 'AFTER'
    
else null
end as [触发器类型描述]
from sys.triggers triggers
inner join sys.tables tables on triggers.parent_id = tables.object_id
where triggers.type ='TR'
order by triggers.create_date

--查询所有索引
select    indexs.Tab_Name as [表名],indexs.Index_Name as [索引名] ,indexs.[Co_Names] as [索引列],
        Ind_Attribute.is_primary_key
as [是否主键],Ind_Attribute.is_unique AS [是否唯一键],
        Ind_Attribute.is_disabled
AS [是否禁用]
from (
   
select Tab_Name,Index_Name, [Co_Names]=stuff((select ''+[Co_Name] from
    (   
select tab.Name as Tab_Name,ind.Name as Index_Name,Col.Name as Co_Name from sys.indexes ind
       
inner join sys.tables tab on ind.Object_id = tab.object_id and ind.type in (1,2)/*索引的类型:0=堆/1=聚集/2=非聚集/3=XML*/
       
inner join sys.index_columns index_columns on tab.object_id = index_columns.object_id and ind.index_id = index_columns.index_id
       
inner join sys.columns Col on tab.object_id = Col.object_id and index_columns.column_id = Col.column_id
    ) t
where Tab_Name=tb.Tab_Name and Index_Name=tb.Index_Name for xml path('')), 1, 1, '')
   
from (
       
select tab.Name as Tab_Name,ind.Name as Index_Name,Col.Name as Co_Name from sys.indexes ind
       
inner join sys.tables tab on ind.Object_id = tab.object_id and ind.type in (1,2)/*索引的类型:0=堆/1=聚集/2=非聚集/3=XML*/
       
inner join sys.index_columns index_columns on tab.object_id = index_columns.object_id and ind.index_id = index_columns.index_id
       
inner join sys.columns Col on tab.object_id = Col.object_id and index_columns.column_id = Col.column_id
    )tb
   
where Tab_Name not like 'sys%'
   
group by Tab_Name,Index_Name
) indexs
inner join sys.indexes Ind_Attribute on indexs.Index_Name = Ind_Attribute.name
order by indexs.Tab_Name

DECLARE @s VARCHAR(4000),@n INT,@i INT,@s1 VARCHAR(100)
SELECT IDENTITY(INT) id,text INTO ##
    FROM syscomments
SELECT @n=@@ROWCOUNT,@i=0
WHILE @i<@n
    BEGIN
        SELECT @i=@i+1,@s=''
        SELECT @s1=REPLACE(REPLACE(RTRIM(LTRIM(STUFF(STUFF(text,CHARINDEX('AS',text),40000,''),1,
                               CHARINDEX('PROC',STUFF(text,CHARINDEX('AS',text),40000,''))+4,''))),CHAR(10),''),CHAR(13),'')
            FROM ## WHERE ID=RTRIM(@i)
            --SELECT @s1,ASCII(SUBSTRING(@s1,3,1))
            --SELECT LEN(REPLACE(REPLACE(@s1,CHAR(13),''),CHAR(10),''))
        SELECT @s='SELECT text FROM tempdb.dbo.## WHERE ID=' + RTRIM(@i)
        EXEC('EXEC master..xp_cmdshell ''bcp "' + @s + ' "  queryout "e:\ProcTXT\' + @s1 + '.txt" -S"ROBINHOME\SQLEXPRESS" -c -U"sa" -P"bd5178"''')
    END
DROP TABLE ##

--自己写的 如何识别换行??? 还有些非存储过程的对象
SELECT top 10 text FROM syscomments where id in(
select object_id from sys.procedures where type = 'P')

SELECT text FROM syscomments where id in(
select object_id from sys.procedures where type = 'P')
and charindex('ALLSTOCK',text)>0
and charindex('CREATE PROCEDURE',text)>0

在一个应用系统中,如果编写了大量的Sybase存储过程,对存储过程进行系统、有效地备份是必须的。而我们通常用的办法是使用Sybase提供的 Sybase Central工具先选定存储过程,然后通过鼠标右键选择Generate DDL的方式把存储过程备份下来。使用这种方式,不仅备份时间特别长(备份文件为6M左右时,达几个小时之久),更要命的是使用该方式备份下来的存储过程文本往往无法直接使用,因为在每个存储过程体后自动加的关键字go,有时就直接放在过程体最后一行尾部,没有空格,这样要使用该文本重新建过程时,需要花大量的时间进行修正。因此,找一种备份速度既快备份后内容又规整的方法来替代该工具是完全有必要的。
笔者在实际工作中,交*使用以下两种方法,对存储过程进行备份。方法一:通过编写嵌入sql的C程序,实现整库存储过程的快速导出。方法二:通过defncopy快速导出指定的存储过程。现分别详细介绍如下:
[b]方法一:通过cpre实现快速导出[/b]
以下程序通过sybase的cpre预编译处理生成可执行文件后,可以实现存储过程的快速导出,在数据库空闲时,可以在一分钟之内导出所有的存储过程(生成的文件有6M左右,而Sybase Central需要以小时计)。
该程序运行时格式如下(设可执行文件为exportproc):
sybase> exprotproc 文件名
执行完后,所有的存储过程体就存放在该文件中,文件的内容也保存了存储过程的书写格式,并在每个存储过程后面加一个单独的行go。为了使程序灵活,在正式导之前根据提示需要输入用户名、口令、联机串、数据库名。
#include
#include
EXEC SQL INCLUDE SQLCA;
void Sql_Error();
main( argc, argv)
int argc;
char **argv;
{
FILE *fp;
char useName[11], usePasswd[11], dbString[16];
char *fpass;
long oldId;
EXEC SQL BEGIN DECLARE SECTION;
char textLine[256];
long id;
char dbName[20];
EXEC SQL END DECLARE SECTION;
/*输入参数不够,给出使用提示*/
if (argc!=2){
printf("Usage As %s \n", argv[0]);
exit(0);
}
if( (fp=fopen(argv[1],"w+"))==NULL){
printf("Open file %s error\n",argv[1]);
exit(0);
}

/*输入联库用户名*/
printf("Please Input user name:");
gets(useName);
/*输入用户口令,在输入时屏幕不显示输入内容*/
fpass=getpass("Please Input Passwd:");
strcpy(usePasswd,fpass);
/*输入联库字符串*/
printf("Please Input Database string:");
gets(dbString);
/*输入要导出其中存储过程的库名*/
printf("Please Input Database Name:");
gets(dbName);
EXEC SQL WHENEVER SQLERROR CALL Sql_Error();
if( ConnectDB(useName, usePasswd, dbString) !=0){ /*连接数据库*/
printf("Can't connect database\n");
exit(0);
}
else
printf("Connect database ok!\n");
printf("Begin to export PROCEDURE Please wait...\n");
EXEC SQL use :dbName;
EXEC SQL commit;
/*声明游标,找出该库中所有的存储过程对应的内容*/
EXEC SQL declare pro_cur cursor for
SELECT id, text from syscomments
where id in (select id from sysobjects
where type = 'P')
and texttype=0
and text is not null
order by id, number,colid2,colid;
EXEC SQL OPEN pro_cur;
EXEC SQL FETCH pro_cur into :id, :textLine;
oldId=-9999L;
while(!sqlca.sqlcode){
/*当一个存储过程结束后,在其过程体后加入新行GO*/
fprintf(fp,"\nGO\n\n");
}
oldId=id;
fprintf(fp,"%s",textLine);
EXEC SQL FETCH pro_cur INTO :id, :textLine;
}
EXEC SQL CLOSE pro_cur;
fprintf(fp,"\nGO\n\n");
fclose(fp);
printf("End export PROCEDURE !\n");
/*断开于数据库的连接*/
DisConnectDB();
printf("Disconnect DataBase success!\n");
}

void Sql_Error()
{
EXEC SQL WHENEVER SQLERROR CONTINUE;
printf("Error.\n");
printf("%s\n",sqlca.sqlerrm.sqlerrmc);
exit(0);
}

/*连接数据库函数*/
int ConnectDB( username, password, dbstring)
EXEC SQL BEGIN DECLARE SECTION;
CS_CHAR *username,*password,*dbstring;
EXEC SQL END DECLARE SECTION;
{
EXEC SQL SET CHAINED OFF;
EXEC SQL CONNECT :username IDENTIFIED BY :password USING :dbstring;
return(sqlca.sqlcode);
}
/*断开数据库函数*/
int DisConnectDB()
{
EXEC SQL DISCONNECT ALL;
return 0;
}

该程序在IBM AIX4.3、hp-unix 11.0、tru64 unix5.0平台上测试通过。



[b]方法二:通过defncopy实现快速导出[/b]
在需要对一些存储过程单独进行备份时,往往使用defncopy通过拼串的方式进行。具体步骤如下:
1.根据需要备份的存储过程,先编写此crtprocout.sql文件,假设导出所有以PR_JF开头的存储过程,内容如下:
select "defncopy -U用户名 -P口令 -S联机串名 out "+name+".sql 库名 "+name from sysobjects where type='P' and name like "PR_JF%"
2.利用上述文件,生成导过程脚本
isql -U用户名 -P口令 -S联机串名 –I crtprocout.sql –o procout
3.改变文件procout的权限
chmod +x procout
4.执行脚本导出过程,每个过程脚本名为:过程名+后缀”.sql”
./procout
小结:以上两种办法通过修改sql语句里的where条件相互之间是可以代替的。但笔者认为,前者适合对整库的过程进行备份,而后者适合对指定的几个过程进行备份。因为前者会对所有的过程脚本生成到一个文件里,适合面向多个过程的管理和备份;而后者一个过程脚本生成一个文件,适合面向单个过程的管理和备份。以上两种方法通过简单修改也可进行触发器等的导出。

转载于:https://www.cnblogs.com/zhuawang/archive/2011/08/22/2148801.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/380305.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用JavaScript中的示例编号MAX_VALUE属性

数字MAX_VALUE属性 (Number MAX_VALUE Property) MAX_VALUE Property is a Number property in JavaScript and it is used to get the maximum value of a number that is possible in JavaScript. MAX_VALUE属性是JavaScript中的Number属性&#xff0c;用于获取JavaScript中可…

文件复制器

文件复制器 2007.08.18.0地狱门神(F.R.C.)http://files.cnblogs.com/Rex/FileCopier.rar 本软件用于复制或更新一个文件夹中的文件到另一个文件夹中。 当你需要经常通过向移动硬盘复制文件来备份重要数据时&#xff0c;可能会遇到如下情况&#xff1a;(1)电脑USB接口过旧&#…

远控免杀专题2---msfvenom的隐藏参数

0x01 msfvenom简介 msfvenom是msfpayload和msfencode的结合体&#xff0c;与2015年6月8日取代了msfpayload和msfencode。在此之后&#xff0c;metasploit-framwork下面的msfpayload&#xff08;载荷生成器&#xff09;&#xff0c;msfencoder&#xff08;编码器&#xff09;&a…

转载CSDN - 从程序员到HR——面试经验分享

CSDN博客一周热文推荐&#xff0c;为您总结回顾过去一周的CSDN博客热门文章&#xff0c;推荐优质的博客作者&#xff0c;分享精华文章和优质博客。 [1] 谭海燕&#xff1a;北漂之惠普H3C面试经历 上一篇讲到了《北漂之百度面试》&#xff0c;今天跟大家分享我在H3C的面试经历。…

ai系统架构_人工智能中的模糊逻辑系统架构

ai系统架构The Fuzzy Logic System is a system which uses Fuzzy logic for reasoning. Fuzzy Logic is a very efficient method for performing human-like reasoning in conditions with uncertainty. 模糊逻辑系统是使用模糊逻辑进行推理的系统。 模糊逻辑是一种在不确定条…

魔力宝贝 服务器状态,魔力宝贝服务端standenemy的参数

格式&#xff1a;encount A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|A是触发战斗类型&#xff0c;这个参数主要用在StandEnemy的NPC参数里面&#xff0c;EventNPC脚本触发战斗有局限。这里详细解释下&#xff1a;触发战斗有2种方法&#xff1a;一种走着撞上去&#xff0c;一种站在…

Firefox中国即将成立,希望在华推行Web标准

Mozilla的首席技术官(vp engineering)Mike Schroepfer给Firefox的粉丝们带来一个好消息:Firefox在中国的负责人李宫昨日接到总部正式通知,将在中国成立公司.Mike称:“公司将设立在清华科技园,在Google、微软的旁边,不过一开始规模不会大,只有几个人.李宫将负责招兵买马.实际上,…

字母小游戏

描述 给你一个乱序的字符串,里面包含有小写字母(a–z)以及一些特殊符号&#xff0c;请你找出所给字符串里面所有的小写字母的个数&#xff0c; 拿这个数对26取余&#xff0c;输出取余后的数字在子母表中对应的小写字母(0对应z,1对应a&#xff0c;2对应b….25对应y)。 输入 第…

缅怀过去

这么多年再不会为你隐忍地哭泣再不会在深夜里独自缅怀我们青涩的年华再不会在伤害你之后把自己伤痕累累却仍然小心翼翼地藏着再不会为过去的你掉眼泪一切都已经成为过去 在你很久没有想我之后我也很久不再去想起你忘却只是唯一逃生的路因为太依赖我们之间真的只能如此了吗忙碌成…

远控免杀专题3---msf自免杀

0x01 免杀能力一览表 上面表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。由于本机测试时只是安装了360全家桶和火绒&#xff0c;所以默认情…

苹果手机的计算机删除了怎么恢复,苹果手机电话删除了怎么恢复

在清理手机通讯录的时候&#xff0c;万一不小心误删了手机通讯录&#xff0c;怎么办。那么被删除的手机通讯录还能找回吗?答案是可以的&#xff0c;苹果手机通讯录删除了怎么恢复呢。苹果手机电话删除了怎么恢复一、从iCloud恢复步骤1、打开【设置】-【Apple ID】-【iCloud】&…

php字符串反转函数_PHP | 反转给定的字符串而不使用库函数

php字符串反转函数Given a string and we have to reverse it without using a library function. 给定一个字符串&#xff0c;我们必须不使用库函数而将其反转。 Example: 例&#xff1a; Input: "Hello world!"Output: "!dlrow olleH"Input: "Wel…

boost::regex学习(2)

四&#xff1a;regex_match例子代码学习1 我们经常会看一个字符串是不是合法的IP地址&#xff0c;合法的IP地址需要符合以下这个特征&#xff1a;xxx.xxx.xxx.xxx 其中xxx是不超过255的整数正则表达式找到上面的这种形式的字符串相当容易&#xff0c;只是判断xxx是否超过255就比…

C++ 随机数

#include < iostream> #include < ctime> #include < cstdlib> using namespace std; int main () { int i,j; // 设置种子 srand( (unsigned)time( NULL ) ); /* 生成 10 个随机数 */ for( i 0; i < 10; i ) { // 生成实际的随机数 j rand…

远控免杀4---Evasion免杀

0x01 免杀能力一览表 1、下表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。3、由于本机测试时只是安装了360全家桶和火绒&#xff0c;所以…

微内核和宏内核的区别_8086微处理器中的过程和宏之间的区别

微内核和宏内核的区别Prerequisite 先决条件 Procedure in 8086 Microprocessor 8086微处理器中的过程 Macros in 8086 Microprocessor 8086微处理器中的宏 过程和宏之间的区别 (Differences between Procedures and Macros ) CharacteristicProcedureMacroNumber of Instruct…

对决

描述 Topcoder 招进来了 n 个新同学&#xff0c;Yougth计划把这个n个同学分成两组&#xff0c;要求每组中每个人必须跟另一组中每个同学进行一次算法对决&#xff0c;问存不存在一种分组方式在k场完成对决。&#xff08;两组中每一组中人数都要大于0&#xff09; //注意&…

我的世界方块云服务器bug,我的世界:两个方块能无限刷经验?这装置太BUG了

在我的世界中&#xff0c;刷经验是一种很常见的事情&#xff0c;不过以往的刷经验机&#xff0c;常常需要建造刷怪塔刷怪&#xff0c;不仅麻烦&#xff0c;工程量大&#xff0c;怪物积累多了还会造成卡顿&#xff0c;非常不方便。但是随着我的世界更新了火炉这种物品之后&#…

远控免杀5---Veil免杀

0x01 免杀能力一览表 1、下表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。3、由于本机测试时只是安装了360全家桶和火绒&#xff0c;所以…

ADO.NET_09_Using 关键字

本文内容 演示 Using 关键字验证 Using 关键字演示 Using 关键字 string connStr "data sourceora11; uidscott; pwdtiger; unicodetrue"; string sqlStr "SELECT * FROM EMP"; using (OracleConnection conn new OracleConnection(connStr)) { conn.Op…