我不知道这个问题是否曾被问过。但是在拼接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