6,129
社区成员
发帖
与我相关
我的任务
分享
example:
CREATE PROCEDURE dbo.my_proc
@first int = NULL, -- NULL default value
@second int = 2, -- Default value of 2
@third int = 3 -- Default value of 3
AS SELECT @first, @second, @third;
GO
--这里执行的方式很多
EXECUTE dbo.my_proc; --结果/*NULL 2 3*/
EXECUTE dbo.my_proc 10, 20, 30;--结果/*10 20 30*/
EXECUTE dbo.my_proc @second = 500;--结果/*NULL 500 3*/
EXECUTE dbo.my_proc 40, @third = 30;--结果/*40 2 30*/
EXECUTE dbo.my_proc 40,default,50;--结果/*40 2 50*/
--a.在MASTER库中创建:
create proc sp_quanju
as
create table #quanju (val sql_variant)
--b.将这个存储过程设置成自动启动
exec sp_procoption 'sp_quanju','StartUp','TRUE'--要关掉只要把最后一个参数设置为FALSE 或者NO
用户在MASTER数据库中创建以sp_开头的存储过程会有意外(in book)
USE master;
GO
CREATE PROC dbo.sp_Proc1
AS
PRINT 'master.dbo.sp_Proc1 executing in ' + DB_NAME();
EXEC('SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = ''BASE TABLE'';');
SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE';
GO
---这里切换到另外一个数据库
USE Northwind;
EXEC dbo.sp_Proc1;
--最后DB_NAME()返回的是Northwind 动态查询返回的Northwind的表 而不是MASTER库 ,静态返回的确实MASTER的表
--这个存储过程里也没有明显切换数据库的语句 自动转化
---这个时候我去姜它变成真正的系统存储过程---
USE master;
EXEC sp_MS_marksystemobject 'dbo.sp_Proc1';
GO
--接着去执行检验 发现都是在切换后的数据库下
USE Northwind;
EXEC dbo.sp_Proc1;
USE pubs;
EXEC dbo.sp_Proc1;
--如果我们在Northwind创建了一个相同名字的存储过程 就是和系统PROC一样的 怎么办?SQL是会调用用户定义的
USE Northwind;
GO
IF OBJECT_ID('dbo.sp_Proc1') IS NOT NULL
DROP PROC dbo.sp_Proc1;
GO
CREATE PROC dbo.sp_Proc1
AS
PRINT 'Northwind.dbo.sp_Proc1 executing in ' + DB_NAME();
GO
--更加神奇的地方是 如果你在master用sp_开头建立的表
USE master;
GO
IF OBJECT_ID('dbo.sp_Globals') IS NOT NULL
DROP TABLE dbo.sp_Globals;
GO
CREATE TABLE dbo.sp_Globals
(
var_name sysname NOT NULL PRIMARY KEY,
val SQL_VARIANT NULL
);
USE Northwind;
INSERT INTO dbo.sp_Globals(var_name, val)
VALUES('var1', 10);
USE pubs;
INSERT INTO dbo.sp_Globals(var_name, val)
VALUES('var2', CAST(1 AS BIT));
USE tempdb;
SELECT var_name, val FROM dbo.sp_Globals;
GO
/*
var_name val
------------ ----------
var1 10
var2 1
*/
----上面的实例告诉我们不要在MASTER里面随便建立以SP_开头的对象