首页 > 解决方案 > SQL Server 中字符串的单引号

问题描述

DECLARE @rpmProvider varchar(200) = 'Prudhvi, raj,Lalith, Kumar';

DECLARE @xml xml
DECLARE @XMT_TEXT AS VARCHAR(200)

SET @XMT_TEXT = REPLACE(REPLACE(REPLACE(''''+ @rpmProvider + '''', ', ', '|'), ',', '</X><X>'), '|', ', ')
SET @xml = cast(('<X>' + @XMT_TEXT + '</X>') as xml)


SELECT N.value('.', 'varchar(50)') as value
FROM @xml.nodes('X') as T(N);

我的输出:

1. 'Prudhvi, raj
2. Lalith, Kumar'

预期输出:

1. 'Prudhvi, raj'
2. 'Lalith, Kumar'

标签: sqlsql-serversql-server-2012sql-server-2008-r2sql-server-2014-express

解决方案


如果您删除所有与 XML 相关的代码并离开

DECLARE @rpmProvider varchar(200) = 'Prudhvi, raj,Lalith, Kumar';
select REPLACE(REPLACE(REPLACE(''''+ @rpmProvider + '''', ', ', '|'), ',', '</X><X>'), '|', ', ') 

你会看到周围没有引号。结果是

'Prudhvi, raj</X><X>Lalith, Kumar'

您可以通过将替换字符串更改为''</X><X>'',在标签前后使用两个单引号来解决此问题:

select REPLACE(REPLACE(REPLACE(''''+ @rpmProvider + '''', ', ', '|'), ',', '''</X><X>'''), '|', ', ')

现在的结果是:

'Prudhvi, raj'</X><X>'Lalith, Kumar'

不过,这段代码非常脆弱。它依赖空格来分隔键、值和对。SQL 语言在字符串解析和操作方面非常薄弱。这种解析应该在数据存储到数据库之前完成。


推荐阅读