使用mssql_connect连接同一SQL Server多数据库失败的解决方案咨询
解决同一SQL Server多库查询的mssql扩展问题
我来给你几个实用的解决方案,完全符合你必须使用mssql_select_db旧方法的要求,比嵌套iframe靠谱多了:
方案1:查询语句直接指定数据库和架构
不用折腾数据库切换,直接在SQL语句里明确写出目标表的完整路径——数据库名.架构名.表名,比如:
// 第一个查询直接指定DUKENUKEN3D库 $q_duke = "select * from DUKENUKEN3D.dbo.DUKE /*DB1*/"; $r_duke = mssql_query($q_duke,$connect_161); // 第二个查询直接指定BIGMAN库 $q_bigman = "select * from BIGMAN.dbo.BIGPEOPLE /*DB2*/"; $r_bigman = mssql_query($q_bigman,$connect_161);
这个方法最省心,不管当前连接的默认数据库是什么,SQL都会精准定位到目标表,完全避开切换数据库的坑。
方案2:强制创建独立数据库连接
你之前的问题根源在于:旧的mssql_connect默认会复用相同参数的连接——你第二个mssql_connect拿到的其实和第一个是同一个连接资源,后续的mssql_select_db('BIGMAN')会覆盖之前的默认数据库,导致第一个查询找不到DUKE表。
解决办法是给mssql_connect加上第四个参数true,强制创建新的独立连接:
$conn_161 = "192.168.0.161"; $user_161 = "ME"; $pass_161 = "what_is_the_password?"; // 第一个独立连接,绑定DUKENUKEN3D库 $connect_161 = mssql_connect($conn_161,$user_161,$pass_161, true); mssql_select_db('DUKENUKEN3D', $connect_161); $q_duke = "select * from DUKE /*DB1*/"; // 注意:你原来的代码里写错了变量名,应该是$q_duke不是$q_wartownik $r_duke = mssql_query($q_duke,$connect_161); // 第二个独立连接,绑定BIGMAN库 $connect_different_db = mssql_connect($conn_161,$user_161,$pass_161, true); mssql_select_db('BIGMAN', $connect_different_db); $q_bigman = "select * from BIGPEOPLE /*DB2*/"; $r_bigman = mssql_query($q_bigman,$connect_different_db );
这样两个连接完全独立,各自的默认数据库不会互相干扰,查询就能正常执行了。
方案3:先查询并缓存结果,再切换数据库
如果数据量不大,可以先连接第一个库,执行查询后把所有结果取出来存到PHP数组里,再切换到第二个库执行查询:
$connect_161 = mssql_connect($conn_161,$user_161,$pass_161); // 先操作第一个库 mssql_select_db('DUKENUKEN3D', $connect_161); $q_duke = "select * from DUKE /*DB1*/"; $r_duke = mssql_query($q_duke,$connect_161); // 把结果缓存到数组 $duke_data = []; while ($row = mssql_fetch_assoc($r_duke)) { $duke_data[] = $row; } // 切换到第二个库执行查询 mssql_select_db('BIGMAN', $connect_161); $q_bigman = "select * from BIGPEOPLE /*DB2*/"; $r_bigman = mssql_query($q_bigman,$connect_161 ); $bigman_data = []; while ($row = mssql_fetch_assoc($r_bigman)) { $bigman_data[] = $row; }
这个方法不用新建连接,但要注意如果结果集很大,会占用较多PHP内存,适合小数据场景。
另外提一句:你原来的代码里有个笔误——$r_duke = mssql_query($q_wartownik,$connect_161);里的$q_wartownik应该是$q_duke,这也是可能导致报错的原因之一哦。
内容的提问来源于stack exchange,提问作者baron_bartek
相关产品推荐
相关产品推荐

