/* 存储过程可以看作是在数据库中的存储t-sql脚本 为什么使用存储过程 1、增加性能 本地存储发送的内容少、调用快、预编译、高速缓存 一般语句的执行:检查权限、检查语法,建立执行计划处理语句的要求 存储过程:创建时已经检查了语法;第一次执行的时候执行计划被创建,被编译; 再次执行时不需要重检查语法、不需要重编译、根据已经缓存的计划来决定是否需要重创建执行计划 2、增强安全 加密、分离(权限设置,用户只需要有执行存储过程的权限,不需要有访问存储过程所使用的对象的权限) 3、在transact-sql中使用非数据库技术 dll 4、编程模式——使用外部编程语言调用 1)input 2)output 3)feedback 状态代码或描述性的文本 4)模块化、可重用、可调用其他存储过程 5)隐藏程序逻辑,便于编程 6)可以调用动态连接库(外接的程序) 基本原则:越简单越好 单一任务 */ /* 分类 1、系统存储过程 存在于master数据库,一般以sp_开头 提供对系统表格数据调用、数据库管理功能、安全管理功能的支持 --表格授权 use pubs go execute sp_table_privileges stores --显示kylin\administrator的所有进程 execute sp_who @loginame='W2K3SERVER\Administrator' --报告有关孤立的 microsoft windows nt 用户和组的信息,这些用户和组已不在 windows nt 环境中,但仍在 microsoft sql server系统表中拥有项。 execute sp_validatelogins 2、本地存储过程 用户创建的解决特定问题的 3、临时存储过程 存储于tempdb 创建、调用时的数据库 使用范围 生存周期 #local 不限数据库 创建时的连接有效 从创建时开始,当创建的连接中断时消失 ##global 不限数据库 所有连接 从创建时开始,当创建的连接中断时消失 直接创建在tempdb的存储过程 tempdb 所有连接 从创建时开始,当数据库服务器服务停止时消失 create proc #local as select '#local' go exec #local go create proc ##global as select '##global' go exec ##global go use tempdb go create procedure directtemp as select * from [pubs].[dbo].[authors] go use northwind go exec tempdb.dbo.directtemp 4、扩展存储过程 c++ xp xp_sendmail既是系统存储过程,也是扩展存储过程 使用objectproperty来判断是否是扩展存储过程 use master --扩展存储过程 select objectproperty(object_id('sp_prepare'), 'isextendedproc') --非扩展存储过程 select objectproperty(object_id('xp_logininfo'), 'isextendedproc') 5、远程存储过程 目前版本中只是为了向后兼容,已被分布式查询替代 */ /* 存储过程在数据库中如何存储 名字 sysobjects 文本 syscomments */ /* 练习1:通过查询分析器中的对象查看器查看存储过程 */ /* 练习2:查看存储过程的内容 图形 语句 */ select * from sysobjects select * from syscomments go select * from syscomments where id = object_id('custorderhist') go select name,text from sysobjects inner join syscomments on sysobjects.id = syscomments.id where sysobjects.name = 'custorderhist' go sp_helptext sp_helptext go use northwind go exec sp_help custorderhist exec sp_helptext custorderhist exec sp_depends custorderhist exec sp_stored_procedures 'custorderhist' /* 系统存储过程 以使用为主 */ /* 本地存储过程的创建、修改、删除 1、t-sql语句 create procedure alter procedure drop procedure create procedure 存储过程名字 as 存储过程文本 go alter procedure 存储过程名字 as 存储过程文本 go drop procedure 存储过程名字 2、企业管理器 右键 向导 */ /* 简单 */ -- -- -- select top 1 * from products -- -- -- select top 1 * from orders -- -- -- select top 1 * from [order details] /*1、和视图比较*/ alter proc sp_qry_salesdetails as select a.productid as 商品编号,a.productname as 商品名称,b.unitprice as 数量,b.quantity as 价格, b.unitprice*b.quantity as 金额,c.requireddate as 销售时间 from [order details] as b join products as a on b.productid=a.productid join orders as c on b.orderid=c.orderid go print '测试' execute sp_qry_salesdetails --递归算法 --视图 存储过程 函数 alter view v_qry_salesdetails as select a.productid as 商品编号,a.productname as 商品名称,b.unitprice as 数量,b.quantity as 价格, b.unitprice*b.quantity as 金额,c.requireddate as 销售时间 from [order details] as b join products as a on b.productid=a.productid join orders as c on b.orderid=c.orderid print '测试' select * from v_qry_salesdetails /* 默认情况下第一次执行时的执行计划被保存,以后执行时都是用这个执行计划,直到服务器重启或存储过程使用的表格变化时 当存储过程变化时,如:参数变化,需要重新编译、制定新的执行计划 当每次调用存储过程时强制重新编译的方法: 1、创建时指定 with recompile 2、sp_recompile */ create procedure sp1 as select * from customers exec sp1 alter procedure sp1 as select * from customers alter procedure sp1 with recompile as select * from customers sp_recompile sp1 --加密存储过程 with encryption select objectproperty(object_id('sp_qry_salesdetails'), 'isencrypted') /* 删除存储过程 drop proc */ use northwind go create proc dbo.sp_dropproc as select 'northwind.dbo.sp_dropproc' go exec northwind.dbo.sp_dropproc go use master go create proc dbo.sp_dropproc as select 'master.dbo.sp_dropproc' go exec master.dbo.sp_dropproc go use northwind go drop proc sp_dropproc go exec sp_dropproc exec master.dbo.sp_dropproc /* 提供输入参数 input */ create proc qry_salesdetails @y int,@m int --varchar(10) as select a.productid as 商品编号,a.productname as 商品名称,b.unitprice as 数量,b.quantity as 价格,b.unitprice*b.quantity as 金额,c.requireddate as 销售时间 from [order details] as b join products as a on b.productid=a.productid join orders as c on b.orderid=c.orderid --where convert(varchar(2),month(c.requireddate)) = @m where year(c.requireddate) = @y and month(c.requireddate) = @m go exec qry_salesdetails 1996,9 exec qry_salesdetails 9,1996 exec qry_salesdetails @m=9,@y=1996 exec qry_salesdetails @y=1996,@m=9 go /* northwind 数据库 orders order details 表格 * 根据指定用户ID显示此用户在1996-07-01到1997-07-01之间的订货记录 要求存储过程文本加密 */ use northwind go --创建存储过程 -- drop proc qry_showorders create proc qry_showorders @custid nchar(5) with encryption --加密 as if @custid is null -- begin -- print '提供了不正确的参数' -- return -- end select * from orders od inner join [order details] oddt on od.orderid = oddt.orderid where shippeddate >='1996-07-01' and shippeddate <='1997-07-01' and od.customerid = @custid go --调用、检验刚刚创建的存储过程 exec qry_showorders @custid = 'vinet' exec qry_showorders null go --检查是否已经被加密 exec sp_helptext qry_showorders /* 返回值 output ,一个返回值变量一次只能有一个返回的值 */ create proc testoutput @a varchar(10) output as select @a = 100 go declare @b varchar(10) --exec testoutput @b output exec testoutput @a=@b output select @b --error create proc sum_money @count money, @unitprice money as select @count*@unitprice go declare @sum_temp money ,@sum_temp2 money set @sum_temp2 = exec sum_money @count= 1.1,@unitprice = 2.2 create proc sum_money @count money, @unitprice money ,@sum money output as set @sum = @count*@unitprice go declare @sum_temp money ,@sum_temp2 money exec sum_money @count= 1.1,@unitprice = 2.2,@sum = @sum_temp output set @sum_temp2= @sum_temp*100 select @sum_temp2 create proc test_output @in nvarchar(100),@out nvarchar(100) output as print 'i''m @in ' + @in set @out = @in print 'i''m @out '+@out go declare @i nvarchar(100),@o nvarchar(100) set @i = '让我们一起来测试' exec test_output @in = @i,@out = @o output select @o /* return 语句和错误处理 */ --return 主要用来进行错误处理 create proc testreturn @a int as if @a<0 begin return(-1) end else if @a = 0 begin return(0) end else begin return(1) end go declare @rtn int exec @rtn = testreturn @a=-100 select @rtn go /* @@error */ select @@error go select 'a'+1 go select @@error select error, description from master.dbo.sysmessages where error = 245 create proc testerror as select 'a'+1 go exec testerror go create proc testerror as declare @e int,@a int ,@b int set @e = 0 set @a = 1 set @b = 0 select @a/@b if @@error<>0 begin print '有错误' set @e = @@error end return @e go declare @er int exec @er = testerror select @er /* @@rowcount */ select @@rowcount select * from customers select @@rowcount /* null 值 */ create proc testreturn @a int as if @a is null begin return(100) end else if @a<0 begin return(-1) end else if @a = 0 begin return(0) end else begin return(1) end /*************************************************************************************************************************** 特殊问题 ***************************************************************************************************************************/ /* 关于sp_的命名 */ use master go create sp_test as select '现在是master数据库' go use northwind go create sp_test as select '现在是northwind数据库' go exec sp_test exec master.dbo.sp_test drop sp_test create proc sp1_test as select '这是master' go use northwind go create proc sp1_test as select '这是northwind' exec sp1_test drop proc sp1_test /* 命名延迟解决方案: 创建存储过程时,应用的对象可以不存在,建议存储过程及引用的对象所有者都设置为dbo */ --按契约编程 use northwind go create proc testdelay as select * from tbldelay go exec testdelay /* 在创建存储过程时可以逻辑上形成组,以便作为同一个管理单元并在一个程序中使用 */ create proc groupedproc;1 as select 'groupedproc;1 ' go create proc groupedproc;2 as select 'groupedproc;2 ' go sp_helptext groupedproc go exec groupedproc;1 go exec groupedproc;2 go exec groupedproc go drop proc groupedproc /* 存储过程嵌套,最多32层 */ create proc a as select 'a' go create proc b as select 'b' exec a go exec b /* 使用默认值 */ -- -- drop proc testdefault create proc testdefault @a int,@b int=2 as select @a,@b go exec testdefault 1 go exec testdefault @a=1 exec testdefault 1,100 /* 在服务器启动时自动运行的存储过程 要求:所有者是dbo,在master数据库中 */ use northwind go create table start ( dt datetime ) go use master go create proc autostart as insert into northwind.dbo.start values(getdate()) go --设置为自动运行 execute sp_procoption @procname = autostart, @optionname = startup, @optionvalue = true go use master --判断是否自动运行 select objectproperty(object_id('autostart'), 'execisstartup') go select * from northwind.dbo.start --停止自动运行 execute sp_procoption @procname = autostart, @optionname = startup, @optionvalue = false execute sp_configure @configname = 'scan for startup procs', @configvalue = 0 reconfigure go /* 扩展存储过程 使用sp_addextendedproc 注册 或使用企业管理器 在master 扩展存储过程 */ -- -- -- -- exec xp_dirtree "D:\" -- -- -- -- -- -- ------msg 15281, level 16, state 1, procedure xp_cmdshell, line 1 -- -- -- ------sql server blocked access to procedure 'sys.xp_cmdshell' of component 'xp_cmdshell' because this component is turned off as part of the security configuration for this server. a system administrator can enable the use of 'xp_cmdshell' by using sp_configure. for more information about enabling 'xp_cmdshell', see "surface area configuration" in sql server books online. ---exec xp_cmdshell "dir *.exe" -- -- -- -- -- -- exec xp_cmdshell tree -- -- -- /* 练习:向northwind数据库中的customers 表格插入记录的存储过程 名字insertcust */ select insert update delete create proc insertcust @custid nchar(5), @cmpnm nvarchar(40), @cntnm nvarchar(30), @cntttl nvarchar(30), @addr nvarchar(60), @city nvarchar(15), @rg nvarchar(15), @pscd nvarchar(10), @cntry nvarchar(15), @phone nvarchar(24), @fax nvarchar(24) as --业务逻辑 insert into customers(customerid,companyname,contactname,contacttitle, address,city,region,postalcode,country,phone,fax) values(@custid,@cmpnm,@cntnm,@cntttl, @addr,@city,@rg,@pscd,@cntry,@phone,@fax) go exec insertcust @custid='abcd',@cmpnm='abc company',@cntnm='anyone',@cntttl='mr.',@addr='anywhere', @city='shanghai',@rg='huangpu',@pscd='200000',@cntry='chian',@phone='021-88888888',@fax='021-66666666' go --简单实现 create proc createcustid @id nchar(5) output as --自动产生客户ID create proc insertcust @cmpnm nvarchar(40), @cntnm nvarchar(30), @cntttl nvarchar(30), @addr nvarchar(60), @city nvarchar(15), @rg nvarchar(15), @pscd nvarchar(10), @cntry nvarchar(15), @phone nvarchar(24), @fax nvarchar(24) as declare @id nchar(t5) exec createcustid @id output insert into customers(customerid,companyname,contactname,contacttitle,address,city,region,postalcode,country,phone,fax) values(@id,@cmpnm,@cntnm,@cntttl,@addr,@city,@rg,@pscd,@cntry,@phone,@fax) go /* 其他要考虑的因素: customerid 自动生成 如果重复怎么处理? 生成新id? 电话号码格式不正确如何处理? return */ ------------------------------------------------------------------------------------------------------------------------ set nocount off select 'a' go -- -- -- set nocount on select 'a' /* 动态语句的使用——动态条件 */ create proc qry_salesdetails @no int = -1,@start char(10),@end char(10) as select a.productid as 商品编号,a.productname as 商品名称,b.unitprice as 数量,b.quantity as 价格,b.unitprice*b.quantity as 金额,c.requireddate as 销售时间 from [order details] as b join products as a on b.productid=a.productid join orders as c on b.orderid=c.orderid where a.productid= @no and c.requireddate<=@end and c.requireddate>=@start go exec qry_salesdetails 6,'1996-01-01','1997-01-01' alter proc qry_salesdetails @no int = -1,@start char(10),@end char(10) as declare @sql varchar(4000) set @sql = 'select a.productid as 商品编号,a.productname as 商品名称, b.unitprice as 数量,b.quantity as 价格,b.unitprice*b.quantity as 金额, c.requireddate as 销售时间 from [order details] as b join products as a on b.productid=a.productid join orders as c on b.orderid=c.orderid where 1=1 ' if @no is not null set @sql = @sql + ' and a.productid = '+convert(varchar(10),@no) if @start is not null and @end is not null set @sql = @sql + ' and c.requireddate >= '''+ @start+'''' + ' and c.requireddate <= '''+ @end+'''' --print @sql exec(@sql) print '''' go exec qry_salesdetails @end=null,@start=null exec qry_salesdetails @no=35,@end=null,@start=null exec qry_salesdetails @no=null,@end='1997-07-01',@start='1996-07-01' exec qry_salesdetails @no=38,@end='1997-07-01',@start='1996-07-01' sp_stored_procedures qry_salesdetails /* 临时表的使用 年度销售汇总表 月汇总 年汇总 */ drop table tempdb..#temp go create table #temp ( 商品编号 varchar(100), 商品名称 varchar(100), 金额 money, 销售时间 datetime, 排序 int ) insert into #temp select a.productid as 商品编号,a.productname as 商品名称, b.unitprice*b.quantity as 金额,c.requireddate as 销售时间, month(c.requireddate) from [order details] as b join products as a on b.productid=a.productid join orders as c on b.orderid=c.orderid where year(c.requireddate) = 1996 insert into #temp(商品编号,金额,排序) select '月汇总',sum(金额),month(销售时间) from #temp group by year(销售时间),month(销售时间) insert into #temp(商品编号,金额,排序) select '年汇总',sum(金额),12 from #temp where 销售时间 is not null select * from #temp order by 排序 ,商品名称 desc select * from #temp drop table tempdb..#temp
SQL과 관련된 더 많은 기술 기사를 보려면 SQL Tutorial 칼럼을 방문하여 알아보세요!
위 내용은 데이터베이스 저장 프로시저에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

SQL 명령은 MySQL에서 DQL, DDL, DML, DCL 및 TCL의 5 가지 범주로 나뉘어 데이터베이스 데이터를 정의, 운영 및 제어하는 데 사용됩니다. MySQL은 어휘 분석, 구문 분석, 최적화 및 실행을 통해 SQL 명령을 처리하고 인덱스 및 쿼리 최적화기를 사용하여 성능을 향상시킵니다. 사용의 예로는 데이터 쿼리에 대한 선택 및 다중 테이블 작업에 가입하는 것이 포함됩니다. 일반적인 오류에는 구문, 논리 및 성능 문제가 포함되며 최적화 전략에는 인덱스 사용, 쿼리 최적화 및 올바른 저장 엔진 선택이 포함됩니다.

SQL의 고급 쿼리 기술에는 하위 쿼리, 창 함수, CTE 및 복잡한 조인이 포함되어 복잡한 데이터 분석 요구 사항을 처리 할 수 있습니다. 1) 하위 쿼리는 각 부서에서 급여가 가장 높은 직원을 찾는 데 사용됩니다. 2) 창 함수와 CTE는 직원 급여 성장 동향을 분석하는 데 사용됩니다. 3) 성능 최적화 전략에는 인덱스 최적화, 쿼리 재 작성 및 파티션 테이블 사용이 포함됩니다.

MySQL은 표준 SQL 기능 및 확장을 제공하는 오픈 소스 관계형 데이터베이스 관리 시스템입니다. 1) MySQL은 한계 조항을 작성, 삽입, 업데이트, 삭제 및 확장과 같은 표준 SQL 작업을 지원합니다. 2) Innodb 및 Myisam과 같은 스토리지 엔진을 사용하여 다양한 시나리오에 적합합니다. 3) 사용자는 테이블 작성, 데이터 삽입 및 저장 프로 시저를 사용하는 것과 같은 고급 기능을 통해 MySQL을 효율적으로 사용할 수 있습니다.

sqlmakesdatamanagementaCcessibletoallbyprovingasimpleyetpooltooltoolforqueryinganddatabases.1) itworkswithrelationalDatabases.2) sql'sstrengthliesinfiltering, andjoiningdata, andjoiningdata, andjoiningdata

SQL 인덱스는 영리한 설계를 통해 쿼리 성능을 크게 향상시킬 수 있습니다. 1. B- 트리, 해시 또는 전문 지수와 같은 적절한 인덱스 유형을 선택하십시오. 2. 복합 인덱스를 사용하여 멀티 필드 쿼리를 최적화하십시오. 3. 데이터 유지 보수 오버 헤드를 줄이려면 과도한 인덱스를 피하십시오. 4. 불필요한 인덱스 재건 및 제거를 포함하여 정기적으로 인덱스를 유지합니다.

SQL에서 제약 조건을 삭제하려면 다음 단계를 수행하십시오. 삭제할 제약 조건을 식별하십시오. Alter Table 문을 사용하십시오. Alter Table Tame 이름 드롭 제약 조건 제한 이름; 삭제를 확인하십시오.

SQL 트리거는 지정된 테이블에서 특정 이벤트가 실행될 때 특정 작업을 자동으로 수행하는 데이터베이스 개체입니다. SQL 트리거를 설정하려면 트리거 이름, 테이블 이름, 이벤트 유형 및 트리거 코드가 포함 된 Trigger 문을 사용할 수 있습니다. 트리거 코드는 AS 키워드를 사용하여 정의되며 SQL 또는 PL/SQL 문 또는 블록을 포함합니다. 트리거 조건을 지정하면 where 절을 사용하여 트리거의 실행 범위를 제한 할 수 있습니다. 트리거 작업은 삽입, 업데이트 또는 삭제 명령문을 사용하여 트리거 코드에서 수행 할 수 있습니다. 신규 및 기존 키워드를 사용하여 영향을받는 키워드를 트리거 코드에서 참조 할 수 있습니다.

인덱싱은 데이터 열을 정렬하여 데이터 검색을 가속화하는 데이터 구조입니다. SQL 쿼리에 인덱스를 추가하는 단계는 다음과 같습니다. 인덱싱 해야하는 열을 결정하십시오. 적절한 인덱스 유형 (b-tree, hash 또는 bitmap)을 선택하십시오. Create Index 명령을 사용하여 인덱스를 작성하십시오. 효율성을 유지하기 위해 지수를 정기적으로 재구성하거나 재구성합니다. 인덱스 추가의 이점에는 개선 된 쿼리 성능, I/O 작동 감소, 최적화 된 정렬 및 필터링 및 개선 된 동시성이 포함됩니다. 쿼리가 종종 특정 열을 사용하는 경우 정렬 또는 그룹화 해야하는 다량의 데이터를 반환하고, 큰 테이블 또는 큰 데이터베이스 테이블이 포함되므로 인덱스 추가를 고려해야합니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

안전한 시험 브라우저
안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

에디트플러스 중국어 크랙 버전
작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

DVWA
DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

드림위버 CS6
시각적 웹 개발 도구

Eclipse용 SAP NetWeaver 서버 어댑터
Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.
