如何使用sqlsrv在php中打印出当前的sql查询


How to print out the current sql query in php with sqlsrv?

我想记录SQL查询(尤其是INSERT、UPDATE和DELETE),以便将这些数据库更改导入另一台服务器上的同一个数据库。我使用PHP和SQLSRV执行以下查询:

$query = "UPDATE table SET column = 0 WHERE id = (?)";
$params = array($myid);
sqlsrv_query($conn, $query, $params);

现在,我想将完整的SQL查询(包括params)存储到一个日志表中。我希望我能用触发器做到这一点,并尝试了以下操作:

SELECT dest.text
FROM   sys.dm_exec_requests dem CROSS APPLY sys.dm_exec_sql_text(dem.sql_handle) dest
WHERE  session_id = @@SPID

但这总是会自动返回。以下似乎更好:

DECLARE @sql nvarchar(max)
SET @sql = 'DBCC INPUTBUFFER(' + CAST(@@SPID AS nvarchar(100)) + ')'
CREATE TABLE #SQL (
    EventType varchar(100),
    Parameters int,
    EventInfo nvarchar(max)
)
INSERT INTO #SQL
EXEC sp_executesql @sql
SELECT @sql = EventInfo FROM #SQL
DROP TABLE #SQL

之后,@sql包含类似的内容

(@P1 int)UPDATE table SET column = 0 WHERE id = (@P1)

但是没有参数。。。有什么方法可以获得包括参数在内的完整SQL查询吗?

否则,我想我必须在PHP中更改所有查询,并且不要使用sqlsrv_query()的'$params'参数。

谢谢。

您可以编写第二个查询,它将上一个查询字符串作为参数:

$query = "UPDATE table SET column = 0 WHERE id = (?)";
$fullQuery = "UPDATE table SET column = 0 WHERE id = ($myid)";

并将$fullQuery作为参数传递给另一个查询:

...
$sampleQuery = "INSERT INTO logTable (Query) VALUES (?)";
$sampleParams = array($fullQuery);
sqlsrv_query($conn, $sampleQuery, $sampleParams);
...

我想你知道为什么要使用参数化查询(避免SQL注入),所以如果你真的不确定查询是否完全安全,我建议不要放弃使用参数。