第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

sqlsrv_query 是否限制一個(gè)查詢(xún)中可以執(zhí)行的語(yǔ)句數(shù)?

sqlsrv_query 是否限制一個(gè)查詢(xún)中可以執(zhí)行的語(yǔ)句數(shù)?

PHP
慕村9548890 2023-04-28 15:16:00
insert我在 PHP循環(huán)中生成 SQL語(yǔ)句for。生成的 SQL 字符串是大量單獨(dú)的 SQL 語(yǔ)句,如下所示:INSERT INTO tbl VALUES(1,2,3);INSERT INTO tbl VALUES(4,5,6);INSERT INTO tbl VALUES(7,8,9);ETC...然后我執(zhí)行:$InsertResult = sqlsrv_query($conn, $InsertSQL);問(wèn)題是只有前 312 條語(yǔ)句被執(zhí)行,而不是完整的 2082 行(只有 312 行被插入到表中)。當(dāng)我將$InsertSQL變量輸出到 JavaScript 控制臺(tái),然后在 SSMS 中手動(dòng)執(zhí)行它時(shí),它完美地工作并插入了所有 2082 行。只有當(dāng)我運(yùn)行$InsertSQL變量時(shí)sqlsrv_query它才不會(huì)完成。我也沒(méi)有收到任何錯(cuò)誤,并且查詢(xún)結(jié)果返回 true,如下行所示:if(!$InsertResult) die('Problem with Insert query: ' . $InsertSQL);當(dāng)我搜索此問(wèn)題的解決方案時(shí),我看到(盡管 PHP 手冊(cè)站點(diǎn)中未提及)sqlsrv_query顯然對(duì)變量有字符串字符限制$SQL(大約 65k 個(gè)字符)。請(qǐng)?jiān)诖颂幉榭戳硪黄?StackOverflow 文章: sqlsrv_query 上的 sql 變量的長(zhǎng)度限制?我認(rèn)為這是問(wèn)題所在,因此創(chuàng)建了一個(gè)較短版本的字符串(通過(guò)僅添加我實(shí)際想要導(dǎo)入的列值)。然而,這個(gè)短得多的版本仍然只插入前 312 行!所以現(xiàn)在看來(lái)這與最大字符串長(zhǎng)度無(wú)關(guān)。事實(shí)上,如果是的話,我應(yīng)該只得到大約 250 行(在 250 條語(yǔ)句之后我大約有 65k 個(gè)字符)。我也可以insert單獨(dú)執(zhí)行每個(gè)語(yǔ)句,但這當(dāng)然需要更長(zhǎng)的時(shí)間。在我的測(cè)試中,這樣做需要 90 秒左右,而在 SMSS 中手動(dòng)運(yùn)行組合語(yǔ)句只需要大約 40 秒。請(qǐng)注意,我還查看了 SQL Server 的批量插入,但是我無(wú)法將文件發(fā)送到安裝了 SQL Server 的機(jī)器(SQL Server 和 Web 服務(wù)器位于不同的計(jì)算機(jī)上)。據(jù)我了解,這消除了這種可能性。非常感謝任何幫助,因?yàn)槲沂仓翢o(wú)法弄清楚是什么限制了我,更不用說(shuō)修復(fù)它了,我不想一次只執(zhí)行一行。
查看完整描述

1 回答

?
慕虎7371278

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超4個(gè)贊

說(shuō)明:

提供的解決方案的一部分是以下解釋?zhuān)?/p>

似乎在執(zhí)行大量 SQL 語(yǔ)句時(shí),Microsoft SQL Server 可能會(huì)在執(zhí)行批處理中的所有語(yǔ)句之前停止處理該批處理。處理批處理的結(jié)果時(shí),SQL Server 使用批處理創(chuàng)建的結(jié)果集填充連接的輸出緩沖區(qū)。這些結(jié)果集必須由客戶(hù)端應(yīng)用程序處理。如果您正在執(zhí)行具有多個(gè)結(jié)果集的大型批處理,SQL Server 會(huì)填充該輸出緩沖區(qū),直到它達(dá)到內(nèi)部限制并且無(wú)法繼續(xù)處理更多結(jié)果集。那時(shí),控制權(quán)返回給客戶(hù)端。此行為是設(shè)計(jì)使然??蛻?hù)端應(yīng)用程序應(yīng)刷新所有待處理的結(jié)果集。一旦所有掛起的結(jié)果集都被客戶(hù)端使用,SQL Server 就會(huì)完成批處理的執(zhí)行。客戶(hù)端應(yīng)用程序可以調(diào)用 sqlsrv_next_result() 直到它返回 NULL。

因此,我認(rèn)為 SQL 語(yǔ)句的長(zhǎng)度沒(méi)有限制,只有 PHP 字符串變量($InsertSQL在您的情況下)的大小被限制為允許的最大 PHP 內(nèi)存限制。這種意外行為的實(shí)際原因是,對(duì)于SET NOCOUNT OFF(默認(rèn)情況下)和大量的單個(gè)INSERT語(yǔ)句,SQL Server 將受影響的行數(shù)作為結(jié)果集返回(例如(1 row affected))。

解決方案:

我能夠重現(xiàn)此問(wèn)題(使用 SQL Server 2012、PHP 7.1.12 和適用于 SQL Server 4.3.0+9904 的 PHP 驅(qū)動(dòng)程序)并且您可以使用以下選項(xiàng)來(lái)解決此問(wèn)題:

  • 使用 刷新掛起的結(jié)果集sqlsrv_next_result()。

  • 在復(fù)雜的 T-SQL 語(yǔ)句中作為第一行執(zhí)行SET NOCOUNT ON,以停止 SQL Server 將受影響的行數(shù)作為結(jié)果集返回。

  • 使用參數(shù)化語(yǔ)句使用sqlsrv_prepare()\sqlsrv_execute()

桌子:

CREATE?TABLE?MyTable?(
????Column1?int,
????Column2?int,
????Column3?int)

一個(gè)復(fù)雜的語(yǔ)句(使用sqlsrv_query()and?sqlsrv_next_result()):

<?php?


// Connection info

$server = 'server\instance';

$database = 'database';

$username = 'username';

$password = 'password';

$cinfo = array(

? ? "Database" => $database,

? ? "UID" => $username,

? ? "PWD" => $password

);


// Statement with sqlsrv_query

$sql = "";

for ($i = 1; $i <= 1000; $i++) {

? ? $sql .= "INSERT INTO MyTable (Column1, Column2, Column3) VALUES (".$i.", 0, 0);";

}

$stmt = sqlsrv_query($con, $sql);

if ($stmt === false) {

? ? echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);

? ? exit;

}


// Clean the buffer

while (sqlsrv_next_result($stmt) != null){};


// End

sqlsrv_free_stmt($stmt);

sqlsrv_close($con);

echo "OK";

?>

一個(gè)復(fù)雜的語(yǔ)句(使用sqlsrv_query()and SET NOCOUNT ON):


<?php?


// Connection info

$server = 'server\instance';

$database = 'database';

$username = 'username';

$password = 'password';

$cinfo = array(

? ? "Database" => $database,

? ? "UID" => $username,

? ? "PWD" => $password

);


// Connection

$con = sqlsrv_connect($server, $cinfo);

if ($con === false) {

? ? echo "Error (sqlsrv_connect): ".print_r(sqlsrv_errors(), true);

? ? exit;

}


// Statement with sqlsrv_query

$sql = "SET NOCOUNT ON;";

for ($i = 1; $i <= 1000; $i++) {

? ? $sql .= "INSERT INTO MyTable (Column1, Column2, Column3) VALUES (".$i.", 0, 0);";

}

$stmt = sqlsrv_query($con, $sql);

if ($stmt === false) {

? ? echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);

? ? exit;

}


// End

sqlsrv_free_stmt($stmt);

sqlsrv_close($con);

echo "OK";

?>

參數(shù)化語(yǔ)句(使用sqlsrv_prepare()and sqlsrv_execute()):


<?php?


// Connection info

$server = 'server\instance';

$database = 'database';

$username = 'username';

$password = 'password';

$cinfo = array(

? ? "Database" => $database,

? ? "UID" => $username,

? ? "PWD" => $password

);


// Connection

$con = sqlsrv_connect($server, $cinfo);

if ($con === false) {

? ? echo "Error (sqlsrv_connect): ".print_r(sqlsrv_errors(), true);

? ? exit;

}


$sql = "INSERT INTO MyTable (Column1, Column2, Column3) VALUES (?, ?, ?);";

$value1 = 0;??

$value2 = 0;??

$value3 = 0;??

$params = array(&$value1, &$value2, &$value3);

$stmt = sqlsrv_prepare($con, $sql, $params);

if ($stmt === false ) {

? ? echo "Error (sqlsrv_prepare): ".print_r(sqlsrv_errors(), true);

? ? exit;

}

for ($i = 1; $i <= 1000; $i++) {

? ? $value1 = $i;??

? ? $value2 = 0;??

? ? $value3 = 0;??

? ? $result = sqlsrv_execute($stmt);

? ? if ($result === false) {

? ? ? ? echo "Error (sqlsrv_execute): ".print_r(sqlsrv_errors(), true);

? ? ? ? exit;

? ? }

}


// End

sqlsrv_free_stmt($stmt);

sqlsrv_close($con);

echo "OK";

?>



查看完整回答
反對(duì) 回復(fù) 2023-04-28
  • 1 回答
  • 0 關(guān)注
  • 195 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)