使用场景:用来拼接大量的字符串(经过测试,用for xml path性能非常好)。
问题:字符串中有英文大于、小于、等于等等对于xml来讲的特殊字符,所以用for xml path拼接后给自动转义了,除了Replace之外有没有其他比较靠谱的方式来处理(尤其是性能上),因为用Replace的话,还不如直接用传统的字符串拼接呢。
测试代码
DECLARE @T AS TABLE ( TestText VARCHAR(50) ) ;
DECLARE @ExecuteSql NVARCHAR(MAX) ;
INSERT  @T
        ( TestText
        )
        SELECT  'Hello > World;'
        UNION ALL
        SELECT  'World < Hello;' ;
SELECT  @ExecuteSql = ( SELECT  '' + TestText
                        FROM    @T
                      FOR
                        XML PATH('')
                      ) ;
SELECT  @ExecuteSql ;

解决方案 »

  1.   

    用replace函数,还是比较方便,但是如果在字符串中存在比较多的 特殊字符的时候,那么用replace就很不方便了,还不如你说的字符串拼接来的灵活
      

  2.   

    另外,之前在论坛,看到有人说,在数据量较大的时候,使用for xml path来拼接大量字符串,可能会有性能问题。
      

  3.   

    http://bbs.csdn.net/topics/390599689
      

  4.   


    DECLARE @T AS TABLE ( TestText VARCHAR(50) ) 
    INSERT  @T( TestText)
    SELECT 'Hello > World;'UNION ALL
    SELECT 'World < Hello;' ;WITH cte AS(SELECT ROW_NUMBER()OVER(ORDER BY GETDATE()) rn,* FROM @T)SELECT a.TestText+b.TestText as TestText  
    FROM cte a,cte b 
    where a.rn<b.rn--结果
    TestText
    ----------------------------------------------------------------------------------------------------
    Hello > World;World < Hello;(1 行受影响)
      

  5.   

    有没有帖子的链接?
    我自己测试过,感觉情况和您说的正好相反(当然,这不是问题的重点,重点是如何解决特殊字符的问题。)。--for xml path
    DECLARE @i INT = 10 ,
        @i_max INT = 10000 ,
        @ExecuteSql NVARCHAR(MAX) = N'' ,
        @DemoStr VARCHAR(36) = NEWID() ;
    SELECT  @ExecuteSql = ( SELECT  @DemoStr
                            FROM    master..spt_values AS A
                                    CROSS JOIN master..spt_values AS B
                            WHERE   A.type = 'p'
                                    AND A.number <= 100
                                    AND a.number >= 1
                                    AND B.type = 'P'
                                    AND B.number <= 100
                                    AND b.number >= 1
                          FOR
                            XML PATH('')
                          )
    SELECT  LEN(@ExecuteSql) ;--传统
    DECLARE @i INT = 10 ,
        @i_max INT = 10000 ,
        @ExecuteSql NVARCHAR(MAX) = N'' ,
        @DemoStr VARCHAR(36) = NEWID() ;
    WHILE @i < @i_max 
        BEGIN
            SELECT  @i = @i + 1 ,
                    @ExecuteSql = @ExecuteSql + @DemoStr ;
        END
    SELECT  LEN(@ExecuteSql) ;
      

  6.   

    有没有帖子的链接?
    我自己测试过,感觉情况和您说的正好相反(当然,这不是问题的重点,重点是如何解决特殊字符的问题。)。--for xml path
    DECLARE @i INT = 10 ,
        @i_max INT = 10000 ,
        @ExecuteSql NVARCHAR(MAX) = N'' ,
        @DemoStr VARCHAR(36) = NEWID() ;
    SELECT  @ExecuteSql = ( SELECT  @DemoStr
                            FROM    master..spt_values AS A
                                    CROSS JOIN master..spt_values AS B
                            WHERE   A.type = 'p'
                                    AND A.number <= 100
                                    AND a.number >= 1
                                    AND B.type = 'P'
                                    AND B.number <= 100
                                    AND b.number >= 1
                          FOR
                            XML PATH('')
                          )
    SELECT  LEN(@ExecuteSql) ;--传统
    DECLARE @i INT = 10 ,
        @i_max INT = 10000 ,
        @ExecuteSql NVARCHAR(MAX) = N'' ,
        @DemoStr VARCHAR(36) = NEWID() ;
    WHILE @i < @i_max 
        BEGIN
            SELECT  @i = @i + 1 ,
                    @ExecuteSql = @ExecuteSql + @DemoStr ;
        END
    SELECT  LEN(@ExecuteSql) ;
    呵呵,不好意思啊,具体的帖子,找不到了,不过你可以找找 他 http://my.csdn.net/hdhai9451
    是他当时提到测试过,然后数据多了,性能不好的,你可以问问他的哈。