使用场景:用来拼接大量的字符串(经过测试,用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 ;
问题:字符串中有英文大于、小于、等于等等对于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 ;
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 行受影响)
我自己测试过,感觉情况和您说的正好相反(当然,这不是问题的重点,重点是如何解决特殊字符的问题。)。--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) ;
我自己测试过,感觉情况和您说的正好相反(当然,这不是问题的重点,重点是如何解决特殊字符的问题。)。--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
是他当时提到测试过,然后数据多了,性能不好的,你可以问问他的哈。