【发布时间】:2023-04-09 22:42:01
【问题描述】:
我有用 CLR (C#) 编写的存储过程,它们位于 SQL Server DB 中。当我运行这些程序时,我会得到返回值和输出。程序代码为:
using(SqlConnection conn = new SqlConnection("context connection=true"))
{
SqlPipe pipe = SqlContext.Pipe;
conn.Open();
string table = tableName.ToString();
string columns = columnList.ToString();
string values = valueList.ToString();
string types = typeList.ToString();
cmd.Connection = conn;
cmd.CommandText = @"
INSERT INTO " + table + " (" + columns + ") VALUES(" + values + ");SELECT SCOPE_IDENTITY();";
pipe.ExecuteAndSend(cmd);
return 48;
现在,当我在 SQL 管理中运行此代码时,我得到:
现在在 PHP 应用程序中,我想访问发送到输出的 SCOPE_IDENTITY() 值或自定义返回值(两者都适用于我的情况)。
$params = array(
array(&FW::$session->requestUniqueId, SQLSRV_PARAM_IN),
array(&$this->rootTable, SQLSRV_PARAM_IN),
array(&$columns, SQLSRV_PARAM_IN),
array(&$values, SQLSRV_PARAM_IN),
array(&$types, SQLSRV_PARAM_IN)
);
$sql="EXEC sp_data_insert @requestId=?, @tableName=?, @columnList=?, @valueList=?, @typeList=?";
$prep=sqlsrv_prepare($this->conn,$sql,$params);
if($prep!==false)
{
$res=sqlsrv_execute($prep);
if($res)
{
//HOW TO ACCESS RETURN VALUE OR OUTPUT VALUE YIELD BY SQL PROCEDURE HERE ?
}
}
谁能告诉我如何访问 CLR 存储过程返回的返回值 48 或/和输出值 (SCOPE_IDENTITY)?
我知道我可以添加输出参数,但这会很痛苦,因为我需要更改数百个程序。我需要在不更改 SQL CLR 的情况下访问这些值。
问题是我无法在 PHP 中完成这项工作。有什么问题?此代码确实执行了存储过程(我看到 DB 中的数据已更改),但我无法访问 PHP 中的返回值:
$sql="DECLARE @ret int EXEC @ret=$stored_procedure; SELECT @ret";
$prep=sqlsrv_prepare($this->conn,$sql,$params);
if($prep!==false)
{
$res=sqlsrv_execute($prep);
if($res)
{
while($row=sqlsrv_fetch_array($prep))
{
print('row='.print_r($row,true));
}
}
}
【问题讨论】:
-
为什么您的代码会暴露 DML 语句。 SQL注入是一回事
-
感谢您的宝贵时间,您能告诉我您是如何使用 php sqlsrv_prepare 和 sqlsrv_execute 方法获得返回值的吗?
-
您很可能需要在
fetch_array中引用$res而不是$prep。然后您需要添加我的答案中的另一部分:INSERT...EXEC的表变量。 -
这不起作用。在这种情况下,$res 是布尔值(sqlsrv_execute 返回布尔值),$prep 是资源,但无法获取(无行)。也使用 INSERT EXEC 不起作用。这似乎是严格的 PHP 问题...
-
@RomainByrd 我知道这是关于 PHP 的,我只是希望它更像 MySQL 接口。您是否为此关注 PHP 文档?为什么你说
INSERT...EXEC不起作用?我什至没有在你的代码中看到它。
标签: php sql-server stored-procedures dynamic-sql sqlclr