【问题标题】:Single quotes for strings in SQL ServerSQL Server 中字符串的单引号
【发布时间】:2019-03-27 12:13:05
【问题描述】:
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'

【问题讨论】:

  • 为什么要添加3个不同sql-server版本的标签?只需标记您使用的那个!谢谢
  • 实际的问题是如何解析包含成对值的字符串。最好的选择是在字符串到达​​服务器之前 这样做。 SQL 这种语言不适合字符串操作。
  • 如果您删除所有与 XML 相关的代码并留下select REPLACE(REPLACE(REPLACE(''''+ @rpmProvider + '''', ', ', '|'), ',', '&lt;/X&gt;&lt;X&gt;'), '|', ', '),您将看到&lt;/X&gt;&lt;X&gt; 周围没有引号。将替换字符串改为'''&lt;/X&gt;&lt;X&gt;''',标签前后各有两个单引号

标签: sql sql-server sql-server-2012 sql-server-2008-r2 sql-server-2014-express


【解决方案1】:

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

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

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

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

您可以通过将替换字符串更改为''&lt;/X&gt;&lt;X&gt;'' 来解决此问题,在标签前后加上两个单引号:

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

现在的结果是:

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

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

【讨论】:

    【解决方案2】:

    你可以试试下面的查询,

    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);
    

    【讨论】:

      【解决方案3】:

      试试这个

      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);
      

      【讨论】:

        【解决方案4】:

        尝试如下

         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 case when left( N.value('.', 'varchar(50)'),1)=''''  then '' else
        '''' end + N.value('.', 'varchar(50)')  +
        case when right( N.value('.', 'varchar(50)'),1)=''''  then '' else
        '''' end as value
        FROM @xml.nodes('X') as T(N);
        
        
        
         value
        'Prudhvi, raj'
        'Lalith, Kumar'
        

        demo link

        【讨论】:

        • 您查询的输出是 1. 'Prudhvi, raj' 2. Lalith, Kumar' 并且它不适用于第二个字符串 Sir !
        • @Prithveeraaj 使用演示链接检查编辑后的答案
        • @Prithveeraaj 你应该接受stackoverflow.com/a/55377202/11683
        猜你喜欢
        • 1970-01-01
        • 2013-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多