我不知道這個問題是否曾被問過。但是在拼接varchars時遇到問題。按字母順序排列varchar時排序。不按預期方式工作
讓我解釋一下:
我有這個表:
CREATE TABLE Table1
(
[Field] [varchar](10) NOT NULL
)
INSERT INTO Table1
VALUES('1'),('2'),('3'),('4'),('5'),('TITLE')
而且我喜歡的輸出是這樣的:
'[TITLE],[1],[2],[3],[4],[5]'
我想要的 'TITLE' 是爲了首先1,2,3,4,5
所以這個查詢將返回有序的結果。我沒有更多的數字那麼 'TITLE'
SELECT
*
FROM
Table1
ORDER BY
LEN([Field]) DESC,
[Field] ASC
隨後的長度我通常Concat的是這樣的VARCHAR:
DECLARE @cols VARCHAR(MAX)
SELECT @cols = COALESCE(@cols + ','+QUOTENAME([Field]),
QUOTENAME([Field]))
FROM
Table1
ORDER BY
LEN([Field]) DESC,
[Field] ASC
但這種回報:
'[5]'
其中我發現真的很奇怪。有人可以解釋爲什麼嗎?
我知道有一個替代解決方案來concate一個varchar。就像這樣:
DECLARE @cols VARCHAR(MAX)
SELECT @cols=STUFF
(
(
SELECT
',' +QUOTENAME([Field])
FROM
Table1
ORDER BY
LEN([Field]) DESC,
[Field] ASC
FOR XML PATH('')
)
,1,1,'')
這將返回我的預期的結果是這樣的:
'[TITLE],[1],[2],[3],[4],[5]'
編輯
建議,@cols
是在開始時爲空不能吧。因爲我刪除了order by
。就像這樣:
DECLARE @cols VARCHAR(MAX)
SELECT @cols = COALESCE(@cols + ','+QUOTENAME([Field]),
QUOTENAME([Field]))
FROM
Table1
我的結果會是這樣的:
'[1],[2],[3],[4],[5],[TITLE]'
EDIT1
這是行不通的:
DECLARE @cols VARCHAR(MAX)
SELECT @cols = COALESCE(@cols + ','+QUOTENAME([Field]),
QUOTENAME([Field]))
FROM(
SELECT [Field]
FROM
Table1
ORDER BY
LEN([Field]) DESC,
[Field] ASC
) AS t
因爲它會給一個異常消息像這樣:
消息1033,級別15,狀態1,行17 ORDER BY子句是 視圖,內聯函數,派生表,子查詢和公用表 表達式無效,除非TOP或FOR XML還指定。
EDIT2
就像我的預期。我不能做到這一點:
SELECT @cols, @cols = COALESCE(@cols + ','+QUOTENAME([Field]),
QUOTENAME([Field]))
FROM
Table1
ORDER BY
LEN([Field]) DESC,
[Field] ASC
監守這將提高這樣一個例外:
消息141,級別15,狀態1,行9 SELECT語句,一個 值分配給一個變量必須不能與數據檢索 操作相結合。
你能解釋一下這個場景的推理嗎?通常當你在一個文本字段中存儲數字時,你做錯了。此外,你必須絕對肯定,該表不會增長到100.000行。 – SWeko 2012-03-30 07:56:50
我想在一個動態的'Pivot'中做到這一點。該表格是靜態的,除了一個表示它被禁用的標誌。女巫我沒有包括在這個例子中。該表是我無法更改的遺留系統的一部分。這是客戶要求的報告。 – Arion 2012-03-30 07:59:57
爲什麼你不能使用你的第二個解決方案?它按預期工作。 – SWeko 2012-03-30 08:12:00