存储过程的三种返回值与其获得方法

本文详细介绍了SQL Server中存储过程的三种返回值及其获取方法:OUTPUT参数返回值、RETURN过程返回值以及SELECT数据集返回值,并通过具体示例展示了如何在存储过程中实现这些返回值。

存储过程的三种返回值与其获得方法

CREATE TABLE [dbo].[Order](
[o_id] [bigint] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
[o_buyerid] [int] NOT NULL
)
1.OUPUT参数返回值

例: 向Order表插入一条记录,返回其标识
CREATE PROCEDURE [dbo].[nb_order_insert](
@o_buyerid int ,
@o_id bigint OUTPUT
)
AS
BEGIN
SET NOCOUNT ON;
BEGIN
INSERT INTO [Order](o_buyerid )
VALUES (@o_buyerid )
SET @o_id = @@IDENTITY
END
END
存储过程中获得方法:
DECLARE @o_buyerid int
DECLARE @o_id bigint
EXEC [nb_order_insert] @o_buyerid ,o_id bigint

2 RETURN过程返回值
CREATE PROCEDURE [dbo].[nb_order_insert](
@o_buyerid int ,
@o_id bigint OUTPUT
)
AS
BEGIN
SET NOCOUNT ON;
IF(EXISTS(SELECT * FROM [Shop] WHERE [s_id] = @o_shopid))
BEGIN
INSERT INTO [Order](o_buyerid )
VALUES (@o_buyerid )
SET @o_id = @@IDENTITY
RETURN 1 — 插入成功返回1
END
ELSE
RETURN 0 — 插入失败返回0
END
存储过程中的获取方法
DECLARE @o_buyerid int
DECLARE @o_id bigint
DECLARE @result bit
EXEC @result = [nb_order_insert] @o_buyerid ,o_id bigint

3.SELECT 数据集返回值
CREATE PROCEDURE [dbo].[nb_order_select](
@o_id int
)
AS
BEGIN
SET NOCOUNT ON;
SELECT o_id,o_buyerid FROM [Order]
WHERE o_id = @o_id
GO

存储过程中的获取方法:
3.1使用临时表
CREATE TABLE [dbo].[Temp](
[o_id] [bigint] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
[o_buyerid] [int] NOT NULL
)
INSERT [Temp] EXEC [nb_order_select] @o_id
– 这时 Temp 就是EXEC执行SELECT 后的结果集
SELECT * FROM [Temp]
DROP [Temp] — 删除临时表
3.2使用openrowset(不过就是速度不怎么样)
SELECT * from openrowset(’provider_name','Trusted_Connection=yes’,'exec nb_order_select’)

PHP 实现域名授权可以有多种方法,以下是常见的五种实现方式: --- ### **1. 基于 IP 地址限制** 通过获取访问者的服务器地址并与其真实 IP 进行匹配,判断是否允许访问。 ```php $allowedIPs = ['192.168.1.1', '127.0.0.1']; // 允许的 IP 列表 $clientIP = $_SERVER['REMOTE_ADDR']; if (!in_array($clientIP, $allowedIPs)) { die('未授权访问'); } ``` 这种方法适用于对特定网络环境下的用户进行授权。 --- ### **2. 验证 HTTP_HOST 或 SERVER_NAME** 检查请求头中的 `HTTP_HOST` 是否属于授权范围内的域名。 ```php $authorizedDomains = ['example.com', 'www.example.com']; $requestHost = strtolower($_SERVER['HTTP_HOST']); if (!in_array($requestHost, $authorizedDomains)) { header("HTTP/1.0 403 Forbidden"); exit('非法域名访问'); } ``` 这种方式适合用于简单的域名验证场景。 --- ### **3. 使用文件存储白名单配置** 将合法的域名列表保存到文件中,并动态加载进行校验。 例如,在 `whitelist.txt` 中列出所有授权域名: ```txt domain1.com domain2.com ``` 然后读取该文件并与当前主机名对比: ```php $domains = file('whitelist.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); $currentDomain = strtolower($_SERVER['HTTP_HOST']); if (!in_array($currentDomain, $domains)) { die('您没有权限访问此页面!'); } ``` 这种方案便于维护和更新。 --- ### **4. 数据库驱动的域名管理** 把所有的有效域存在数据库表里,程序运行时查询是否有对应记录即可完成认证操作。 假设有如下 SQL 表结构: ```sql CREATE TABLE authorized_domains ( id INT AUTO_INCREMENT PRIMARY KEY, domain VARCHAR(255) NOT NULL UNIQUE ); INSERT INTO authorized_domains (domain) VALUES ('testsite.org'), ('anothersite.net'); ``` 之后可以在脚本中做这样的事情: ```php $conn = new mysqli("localhost", "user", "password", "dbname"); $query = sprintf( "SELECT COUNT(*) AS count FROM authorized_domains WHERE domain='%s'", mysqli_real_escape_string($conn,$_SERVER["HTTP_HOST"]) ); $result=mysqli_query($conn,$query); $row=mysqli_fetch_assoc($result); if ($row['count'] < 1){ echo"对不起!这个网站不允许从".$_SERVER["HTTP_HOST"]." 访问"; }else{ // 正常处理... } ``` 采用数据的方式更灵活也更容易扩展功能比如添加过期时间等属性控制有效期长短等等。 --- ### **5. API 授权机制** 如果项目规模较大,则可通过远程调用专门的服务端API来进行最终判定。客户端先提交自身信息如hostname、appkey之类的参数给服务端;后者依据内部规则决定是否批准并通过返回值告知结果如何。 示例伪代码展示交互流程大致如此—— #### 客户端侧发起请求部分 ```php function checkAuth(){ $data=array(); $data["host"]=$_SERVER["HTTP_HOST"]; $ch=curl_init();curl_setopt($ch,CURLOPT_URL,"http://authserver/check.php");curl_setopt($ch,CURLOPT_RETURNTRANSFER,true); curl_setopt($ch,CURLOPT_POSTFIELDS,json_encode($data)); $response=json_decode(curl_exec($ch)); if(isset($response->status)&&$response->status==true){return true;} else{return false;} } // 应用层调用上面函数检测许可状态 if(!checkAuth()){die("Access Denied");} ``` #### 而在实际生产环境中为了安全起见通常还需要加入更多加密手段防止伪造报文攻击等问题发生! 以上就是利用 PHP 编程语言达成不同类型需求下所采取的一些常见技术解决方案啦~ ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值