Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
T-SQL文本排序_Sql_Sql Server 2005 - Fatal编程技术网

T-SQL文本排序

T-SQL文本排序,sql,sql-server-2005,Sql,Sql Server 2005,表1中的一列表示column1存储的数据如下 Column1 test2;test1;test3 test21;test11;test32 -- Column1 test1;test2;test3 test11;test21;test32 -- 我想更新此列,以便在将数据拆分为之后,将数据存储在排序格式中;如下 Column1 test2;test1;test3 test21;test11;test32 -- Column1 test1;test2;test3 test11;test21;tes

表1中的一列表示column1存储的数据如下

Column1 test2;test1;test3 test21;test11;test32 -- Column1 test1;test2;test3 test11;test21;test32 -- 我想更新此列,以便在将数据拆分为之后,将数据存储在排序格式中;如下

Column1 test2;test1;test3 test21;test11;test32 -- Column1 test1;test2;test3 test11;test21;test32 -- 如何以最简单的形式编写查询?我正在使用SQLServer2005


我可以假设没有一个使用T-SQL的简单解决方案,然后我可以使用CLR函数吗?

通过原始SQL是不可能的。您可以找到拆分函数T-SQL或CLR之类的实现,并通过将字符串列表临时转换为表来处理数据,对其进行排序,然后重新联接。

以基于集合的方式在T-SQL中执行此操作的示例。它假定目标表具有唯一标识每一行的PK。 请注意,排序是基于文本的。我添加了第三行测试数据来显示这一点

DECLARE @t TABLE
(id int ,column1 varchar(50))

INSERT @t
SELECT 1,'test2;test1;test3'
UNION ALL SELECT 2,'test21;test11;test32'
UNION ALL SELECT 3,'test222;test22;test2;test1;test3'

DECLARE @chr_delim char(1)
SET @chr_delim = ';'

;WITH splitCTE
AS
(
SELECT  D.id
        ,SUBSTRING(s,n,CHARINDEX(@chr_delim, s + @chr_delim,n) -n) as ELEMENT
FROM (SELECT id, column1 as s from @t) AS D
JOIN (SELECT ROW_NUMBER() OVER (ORDER BY name) AS n
      FROM master..spt_values
      ) AS nums
ON n <= LEN(s)
AND SUBSTRING(@chr_delim + s,n,1) = @chr_delim
)
UPDATE t
SET column1 = z.col1
FROM @t AS t
JOIN    (
            SELECT DISTINCT id , STUFF(d.x,1,1,'') AS col1
            FROM splitCTE AS r
            CROSS APPLY (SELECT ';' + ELEMENT 
                                 FROM splitCTE AS c 
                                 WHERE c.id = r.id 
                                 ORDER BY ELEMENT FOR XML PATH ('')
                                ) d(x)
        ) AS z
ON z.id = t.id      

SELECT * FROM @t

如果可能的话,改变你的模式,这样你就不会在一列中有单独的值;因此,不必进行这种可怕的字符串解析,新数据将与已排序的文本一起插入。我正在寻找一个简单的解决方案来更新以前未排序的数据。您应该阅读。您可以使用写入临时表的方式拆分此列,然后重新调用和重新插入非原始SQL?@JNK没有ANSI SQL拆分函数。@ean5533-我知道这一点,但这并不意味着您不能创建udf或在查询中放入WHILE循环来处理它。暗示您需要SQL以外的东西来实现这一点充其量是不真实的。@JNK虽然不在ANSI SQL中,但它是一个T-SQL扩展。是的,你可以创建一个UDF来处理这个问题,但我很确定这不是STO的观点——他的观点是没有一个简单的一行程序可以解决OP的问题。无论如何,我认为“不诚实”是相当严厉的。你真的认为斯托在撒谎吗?@ean5533-不要认为他在撒谎,但说没有办法这样做是不准确的。如果我认为他在撒谎,我就会投反对票。此外,ANSI SQL是不相关的,因为OP将问题声明并标记为SQL Server 2005。