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

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

nvarchar串聯(lián)/索引/nvarchar(Max)令人費(fèi)解的行為

nvarchar串聯(lián)/索引/nvarchar(Max)令人費(fèi)解的行為

nvarchar串聯(lián)/索引/nvarchar(Max)令人費(fèi)解的行為我今天在SQLServer中遇到了一個(gè)非常奇怪的問題(2008R2和2012)。我試圖使用連接與select聲明。我已經(jīng)找到了解決辦法,但我真的很想了解這里發(fā)生了什么,以及為什么它沒有給我預(yù)期的結(jié)果。有人能給我解釋一下嗎?http://sqlfiddle.com/#!6/7438a/1應(yīng)要求,這里的代碼也是:-- base tablecreate table bla (     [id] int identity(1,1) primary key,     [priority] int,     [msg] nvarchar(max),     [autofix] bit)-- table without primary key on id columncreate table bla2 (     [id] int identity(1,1),     [priority] int,     [msg] nvarchar(max),     [autofix] bit)-- table with nvarchar(1000) instead of maxcreate table bla3 (     [id] int identity(1,1) primary key,     [priority] int,     [msg] nvarchar(1000),     [autofix] bit)-- fill the three tables with the same valuesinsert into bla ([priority], [msg], [autofix])values (1, 'A', 0),        (2, 'B', 0)insert into bla2 ([priority], [msg], [autofix])values (1, 'A', 0),        (2, 'B', 0)insert into bla3 ([priority], [msg], [autofix])values (1, 'A', 0),        (2, 'B', 0);declare @a nvarchar(max) = ''declare @b nvarchar(max) = ''declare @c nvarchar(max) = ''declare @d nvarchar(max) = ''declare @e nvarchar(max) = ''declare @f nvarchar(max) = ''-- I expect this to work and generate 'AB', but it doesn'tselect @a = @a + [msg]     from bla    where   autofix = 0     order by [priority] asc-- this DOES work: convert nvarchar(4000)select @b = @b + convert(nvarchar(4000),[msg])     from bla    where   autofix = 0     order by [priority] asc-- this DOES work: without WHERE clauseselect @c = @c + [msg]     from bla    --where autofix = 0     order by [priority] asc-- this DOES work: without the order byselect @d = @d + [msg]     from bla    where   autofix = 0     --order by [priority] asc-- this DOES work: from bla2, so without the primary key on idselect @e = @e + [msg]
查看完整描述

2 回答

?
絕地?zé)o雙

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

這個(gè)KB文章由VanDerNorth鏈接的已經(jīng)包含了行

未定義聚合連接查詢的正確行為。

但接下來,通過提供一個(gè)似乎確實(shí)表明確定性行為是可能的解決方案,把水弄得有點(diǎn)渾濁。

為了實(shí)現(xiàn)聚合連接查詢的預(yù)期結(jié)果,請(qǐng)將任何Transact-SQL函數(shù)或表達(dá)式應(yīng)用于SELECT列表中的列,而不是ORDERBY子句中的列。

有問題的查詢不會(huì)將任何表達(dá)式應(yīng)用于ORDER BY條款。

2005年文章SQL Server中的訂單保證。狀態(tài)

出于向后兼容性的原因,SQLServer提供了對(duì)SELECT@p=@p+1類型賦值的支持.在最高的范圍內(nèi)訂購(gòu)。

在連接工作的計(jì)劃中,與表達(dá)式一起計(jì)算標(biāo)量。[Expr1003] = Scalar Operator([@x]+[Expr1004])出現(xiàn)在該類別的上方。

在無法工作的計(jì)劃中,計(jì)算標(biāo)量出現(xiàn)在排序下面。如在此連接項(xiàng)從2006年開始@x = @x + [msg]顯示在為每一行計(jì)算的排序下面,但所有計(jì)算結(jié)果都使用@x..在……里面另一個(gè)類似的連接項(xiàng)從2006年起,微軟的回應(yīng)就談到“解決”這個(gè)問題。

Microsoft對(duì)有關(guān)此問題的所有后續(xù)連接項(xiàng)的響應(yīng)(還有許多)指出,這一點(diǎn)根本無法保證

例1

我們不保證連接查詢的正確性(比如使用變量賦值和特定順序的數(shù)據(jù)檢索)。SQL Server 2008中的查詢輸出可以根據(jù)計(jì)劃選擇、表中的數(shù)據(jù)等進(jìn)行更改。即使語法允許您編寫一個(gè)SELECT語句,將有序的行檢索與變量賦值混合在一起,您也不應(yīng)該一直依賴這種工作。

例2

你所看到的行為是故意的。在帶有ORDERBY子句的查詢中使用賦值操作(在本例中為串聯(lián))具有未定義的行為。由于查詢計(jì)劃的更改,這可能在不同版本之間發(fā)生更改,甚至在特定的服務(wù)器版本中也會(huì)發(fā)生變化。即使有解決辦法,也不能依賴這種行為。有關(guān)更多細(xì)節(jié),請(qǐng)參見下面的KB文章:
http://support.microsoft.com/kb/287515唯一的保障機(jī)制如下:

  1. 使用游標(biāo)按特定順序遍歷行,并將值連接起來。
  2. 用于帶有Orderby的xml查詢,以生成級(jí)聯(lián)的值
  3. 使用CLR聚合(這不適用于ORDERBY子句)

例3

你所看到的行為實(shí)際上是故意的。這與SQL是一種集操作語言有關(guān)。SELECT列表中的所有表達(dá)式(這也包括賦值)不能保證對(duì)每個(gè)輸出行精確執(zhí)行一次。實(shí)際上,SQL查詢優(yōu)化器試圖盡可能少地執(zhí)行它們。當(dāng)您根據(jù)表中的某些數(shù)據(jù)計(jì)算變量的值時(shí),這將給出預(yù)期的結(jié)果,但是當(dāng)您要分配的值取決于同一變量的前一個(gè)值時(shí),結(jié)果可能是非常出乎意料的。如果查詢優(yōu)化器將表達(dá)式移動(dòng)到查詢樹中的不同位置,則可能會(huì)得到較少的計(jì)算次數(shù)(或者只得到一次,如您的一個(gè)示例所示)。這就是為什么我們不建議使用“迭代”類型賦值來計(jì)算聚合值的原因。我們發(fā)現(xiàn)基于XML的解決方案.通常為客戶服務(wù)。

例4

即使沒有ORDERBY,我們也不能保證@var=@var+將為任何影響多行的語句生成級(jí)聯(lián)值。表達(dá)式的右側(cè)可以在查詢執(zhí)行期間計(jì)算一次或多次,而且正如我所說的行為依賴于計(jì)劃。

例5

帶有SELECT語句的變量賦值是一種專有語法(僅為T-SQL),在這種語法中,行為是未定義的,如果產(chǎn)生多個(gè)行,則計(jì)劃依賴。如果需要進(jìn)行字符串連接,則使用SQLCLR聚合或用于基于XML查詢的連接或其他關(guān)系方法。


查看完整回答
反對(duì) 回復(fù) 2019-06-29
  • 2 回答
  • 0 關(guān)注
  • 1039 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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