【问题标题】:SQL Server Insert Fails with SET operationsSQL Server 插入失败并执行 SET 操作
【发布时间】:2018-10-12 19:39:52
【问题描述】:

我收到此错误:

插入失败,因为以下 SET 选项的设置不正确:“ANSI_NULLS”。验证 SET 选项是否适用于索引视图和/或计算列上的索引和/或过滤索引和/或查询通知和/或 XML 数据类型方法和/或空间索引操作。

我一直在使用 XML 路径将变量与 '^' 连接起来,但注意到某些字符的格式会不正确(即 & 变为 &),所以我补充说:

, TYPE).value('.[1]', 'varchar(max)'

但是现在我得到了上面显示的错误。

SELECT 
    SUBSTRING((SELECT 
                   '^' + CONVERT(nvarchar(max), ST1.[planId]) AS [text()]
               FROM STable ST1
               WHERE ST1.cid = ST2.cid
               ORDER BY ST1.cid
               FOR XML PATH (''), TYPE).value('.[1]', 'varchar(max)'), 2, 1000) [planId] 
FROM 
    dbo.STable ST2

【问题讨论】:

  • 您需要在查询后进行替换。

标签: sql sql-server for-xml-path


【解决方案1】:
SELECT REPLACE(SELECT SUBSTRING(
            (
                SELECT 
                '^'+CONVERT(nvarchar(max), ST1.[planId])  AS [text()]
                FROM STable ST1
                WHERE ST1.cid= ST2.cid
                ORDER BY ST1.cid
                FOR XML PATH (''), TYPE).value('.[1]', 'varchar(max)'
            ), 2, 1000) [planId] 
FROM dbo.STable ST2
,'&amp','&');

【讨论】:

    【解决方案2】:

    此错误取决于 SQL 服务器如何配置为允许 COLLATE。对于您使用该服务器的特定情况,您必须在每个语句中指定 COLLATE(服务器中的各种可用项)。

    SELECT 
    SUBSTRING((SELECT 
                   '^' + CONVERT(nvarchar(max), ST1.[MilestoneId]) COLLATE Latin1_General_CI_AS AS [text()]
               FROM STable ST1
               WHERE ST1.cid = ST2.cid
               ORDER BY ST1.cid
               FOR XML PATH (''), TYPE).value('.[1]', 'varchar(max)'), 2, 1000) [planId] 
    FROM 
    dbo.STable ST2 
    

    还可以在 QUOTED_IDENTIFIER ON 和 ANSI_NULLS ON 的会话中重新创建或更改存储过程(如果您已经创建了一个),以避免出现问题。

    【讨论】:

      猜你喜欢
      • 2014-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-05
      • 2013-02-03
      • 1970-01-01
      相关资源
      最近更新 更多