在 SQLSRV 中添加 temptable 并查询它时没有返回结果
No results come back when adding temptable and querying it in SQLSRV
我正在尝试创建一个临时文件table 并进行一些填充临时文件table 的计算,最后从创建的临时文件table 中获取结果。但到目前为止,我一直没有成功。我的查询有点复杂,但这是我正在尝试做的事情。此代码假定我们已使用 codeigniter 设置数据库连接。
-- This generate no results i.e. Array ()
$sql = "CREATE TABLE #output(name varchar NULL, id int NULL);
insert into #output (name,id) VALUES('sam',5)
SELECT * FROM #output";
$res = $this->db->query($sql);
--Also tried this and returns nothing
$queryList = [
'sql1' => "IF OBJECT_ID('tempdb.dbo.#output', 'U') IS NOT NULL DROP TABLE #output;",
'sql2' => "CREATE TABLE #output(name varchar NULL, id int NULL);",
'sql3' => "insert into #output (name,id) VALUES('sam',5)",
'sql4' => "SELECT * FROM #output"
];
$result = array();
foreach($queryList as $key => $value){
$result[$key] = $this->db->query($value, FALSE, TRUE);
}
这两个是为使用 codeigniter db 驱动程序而编写的。 None 以上查询甚至在数据库的 tempdb 中产生#output temptable。
我也试过直接使用sqlsrv_query
,这个至少创建了#output temptable但没有给我任何结果。
-- Created the #output temptable but didn't give me back the data inserted
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn ) {
echo "Connection established.<br />";
$sql = "CREATE TABLE #output(name varchar NULL, id int NULL);
insert into #output (name,id) VALUES('sam',5)
SELECT * FROM #output
--DROP TABLE #output";
$stm = sqlsrv_query($conn, $sql,[]);
while( $obj = sqlsrv_fetch_object( $stm )) {
echo $obj->name . '<br />';
//print_r($obj);
}
我已经尝试了很多方案,但无法弄清楚我的代码有什么问题。哦,顺便说一句,我也尝试了 codeigniter
trans_start()
并结束并将每个查询添加为单独的查询,但这也没有成功。我无法思考或搜索任何其他内容,所以这是我的帮助请求。
这是我的环境:
SQLSRV 5.3
SQL 服务器 2012
ODBC 驱动程序 17
CodeIgniter 3.1.9
PHP 7.0.31
解法:
您需要解决一些问题:
- 使用此格式定义
varchar
列:varchar [(n|max)]
。当 n
未指定时,默认长度为 1,当您尝试插入值 'sam' 时,将生成警告。
- 将
SET NOCOUNT ON;
作为第一条语句。如果您错过了该部分,您的语句将 return 多个结果集,因此您必须使用 sqlsrv_next_result()
. 使结果集可用
工作示例:
<?php
$server = 'server\instance,port';
$database = 'database';
$username = 'username';
$password = 'password';
$cinfo = array(
"Database" => $database,
"UID" => $username,
"PWD" => $password
);
$conn = sqlsrv_connect($server, $cinfo);
if ($conn === false) {
echo print_r(sqlsrv_errors(), true);
exit;
}
# Statement
$sql = "
SET NOCOUNT ON;
CREATE TABLE #output(name varchar(50) NULL, id int NULL);
INSERT INTO #output (name, id) VALUES ('sam', 5);
SELECT * FROM #output;
";
$stmt = sqlsrv_query($conn, $sql);
if ($stmt === false) {
echo print_r(sqlsrv_errors(), true);
exit;
}
# Results
while ($obj = sqlsrv_fetch_object($stmt)) {
echo 'Name: '.$obj->name.'</br>';
echo 'ID: '.$obj->id.'</br>';
}
# End
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>
备注:
我对 CodeIgniter 不太熟悉,但我认为这是你的问题。
我正在尝试创建一个临时文件table 并进行一些填充临时文件table 的计算,最后从创建的临时文件table 中获取结果。但到目前为止,我一直没有成功。我的查询有点复杂,但这是我正在尝试做的事情。此代码假定我们已使用 codeigniter 设置数据库连接。
-- This generate no results i.e. Array ()
$sql = "CREATE TABLE #output(name varchar NULL, id int NULL);
insert into #output (name,id) VALUES('sam',5)
SELECT * FROM #output";
$res = $this->db->query($sql);
--Also tried this and returns nothing
$queryList = [
'sql1' => "IF OBJECT_ID('tempdb.dbo.#output', 'U') IS NOT NULL DROP TABLE #output;",
'sql2' => "CREATE TABLE #output(name varchar NULL, id int NULL);",
'sql3' => "insert into #output (name,id) VALUES('sam',5)",
'sql4' => "SELECT * FROM #output"
];
$result = array();
foreach($queryList as $key => $value){
$result[$key] = $this->db->query($value, FALSE, TRUE);
}
这两个是为使用 codeigniter db 驱动程序而编写的。 None 以上查询甚至在数据库的 tempdb 中产生#output temptable。
我也试过直接使用sqlsrv_query
,这个至少创建了#output temptable但没有给我任何结果。
-- Created the #output temptable but didn't give me back the data inserted
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn ) {
echo "Connection established.<br />";
$sql = "CREATE TABLE #output(name varchar NULL, id int NULL);
insert into #output (name,id) VALUES('sam',5)
SELECT * FROM #output
--DROP TABLE #output";
$stm = sqlsrv_query($conn, $sql,[]);
while( $obj = sqlsrv_fetch_object( $stm )) {
echo $obj->name . '<br />';
//print_r($obj);
}
我已经尝试了很多方案,但无法弄清楚我的代码有什么问题。哦,顺便说一句,我也尝试了 codeigniter
trans_start()
并结束并将每个查询添加为单独的查询,但这也没有成功。我无法思考或搜索任何其他内容,所以这是我的帮助请求。
这是我的环境:
SQLSRV 5.3
SQL 服务器 2012
ODBC 驱动程序 17
CodeIgniter 3.1.9
PHP 7.0.31
解法:
您需要解决一些问题:
- 使用此格式定义
varchar
列:varchar [(n|max)]
。当n
未指定时,默认长度为 1,当您尝试插入值 'sam' 时,将生成警告。 - 将
SET NOCOUNT ON;
作为第一条语句。如果您错过了该部分,您的语句将 return 多个结果集,因此您必须使用sqlsrv_next_result()
. 使结果集可用
工作示例:
<?php
$server = 'server\instance,port';
$database = 'database';
$username = 'username';
$password = 'password';
$cinfo = array(
"Database" => $database,
"UID" => $username,
"PWD" => $password
);
$conn = sqlsrv_connect($server, $cinfo);
if ($conn === false) {
echo print_r(sqlsrv_errors(), true);
exit;
}
# Statement
$sql = "
SET NOCOUNT ON;
CREATE TABLE #output(name varchar(50) NULL, id int NULL);
INSERT INTO #output (name, id) VALUES ('sam', 5);
SELECT * FROM #output;
";
$stmt = sqlsrv_query($conn, $sql);
if ($stmt === false) {
echo print_r(sqlsrv_errors(), true);
exit;
}
# Results
while ($obj = sqlsrv_fetch_object($stmt)) {
echo 'Name: '.$obj->name.'</br>';
echo 'ID: '.$obj->id.'</br>';
}
# End
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>
备注:
我对 CodeIgniter 不太熟悉,但我认为这是你的问题。