【问题标题】:Could not able to insert the xml data into a table无法将 xml 数据插入表中
【发布时间】:2018-03-31 10:52:42
【问题描述】:

当我尝试将值插入表中时,出现以下错误。 我们不能删除 XML 中的空格,因为它是从 Javascript 生成的。 如何将以下数据插入 XMLdata 表。

从字符串转换日期和/或时间时转换失败。

这是样本数据(@bbhdn5):

341300-02-1|04/10/2018 01:18:29|04/10/2018 06:18:29|133072;
261600-01-1|04/10/2018 06:18:29|04/10/2018 11:18:29|133073;
781100-R1-1|04/10/2018 11:18:29|04/10/2018 16:18:29|133074;

代码:

create table WMC_Savexmldata 
(
     XML nvarchar(max)
)

Declare @bbhdn5 nvarchar(max) 
set @bbhdn5='341300-02-1|04/10/2018 01:18:29|04/10/2018 06:18:29|133072; 261600-01-1|04/10/2018 06:18:29|04/10/2018 11:18:29|133073; 781100-R1-1|04/10/2018 11:18:29|04/10/2018 16:18:29|133074;'

insert into WMC_Savexmldata
    select @bbhdn5

【问题讨论】:

  • 需要快速响应。请帮忙,
  • 我们可以运行的显示错误的发布代码。我没有看到 @bbhdn5 变量或赋值的声明。
  • 声明@bbhdn5 nvarchar(max) set @bbhdn5='341300-02-1|04/10/2018 01:18:29|04/10/2018 06:18:29|133072; 261600-01-1|04/10/2018 06:18:29|04/10/2018 11:18:29|133073; 781100-R1-1|04/10/2018 11:18:29|04/10/2018 16:18:29|133074;'
  • 我从您的评论中添加了代码,您的问题属于它。这不会重现错误。我的猜测是,您的表上可能有一个触发器,这就是问题所在。
  • 这完全是你所追求的,你发布的代码运行得很好。它创建的表只有varchar 类型的列,并插入相同类型的值......有什么问题?

标签: sql-server sqlxml


【解决方案1】:

虽然这个问题绝对是误导,但我的魔法水晶球突然开始闪烁并告诉我,你可能正在寻找这个:

替换分隔符 ; and | 允许将您的 CSV 字符串传输到此 XML:

<x>
  <y>341300-02-1</y>
  <y>04/10/2018 01:18:29</y>
  <y>04/10/2018 06:18:29</y>
  <y>133072</y>
</x>
<x>
  <y> 261600-01-1</y>
  <y>04/10/2018 06:18:29</y>
  <y>04/10/2018 11:18:29</y>
  <y>133073</y>
</x>
<x>
  <y> 781100-R1-1</y>
  <y>04/10/2018 11:18:29</y>
  <y>04/10/2018 16:18:29</y>
  <y>133074</y>
</x>

我用它来获取数据作为派生表:

DECLARE @bbhdn5 NVARCHAR(MAX); 
SET @bbhdn5=N'341300-02-1|04/10/2018 01:18:29|04/10/2018 06:18:29|133072; 261600-01-1|04/10/2018 06:18:29|04/10/2018 11:18:29|133073; 781100-R1-1|04/10/2018 11:18:29|04/10/2018 16:18:29|133074;';

WITH Splitted AS
(
    SELECT CAST('<x><y>' + REPLACE(REPLACE(@bbhdn5,'|','</y><y>'),';','</y></x><x><y>') + '</y></x>' AS XML) AS Casted
)
SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS RowNumber
        ,A.x.value('y[1]','nvarchar(max)') AS RowCode
        ,CONVERT(DATETIME,A.x.value('y[2]','nvarchar(max)'),103) AS Date1
        ,CONVERT(DATETIME,A.x.value('y[3]','nvarchar(max)'),103) AS Date2
        ,A.x.value('y[4]','int') AS SomeNumber
FROM Splitted
CROSS APPLY Casted.nodes('/x[y/text()]') AS A(x);

结果

+-----------+-------------+-------------------------+-------------------------+------------+
| RowNumber | RowCode     | Date1                   | Date2                   | SomeNumber |
+-----------+-------------+-------------------------+-------------------------+------------+
| 1         | 341300-02-1 | 2018-10-04 01:18:29.000 | 2018-10-04 06:18:29.000 | 133072     |
+-----------+-------------+-------------------------+-------------------------+------------+
| 2         | 261600-01-1 | 2018-10-04 06:18:29.000 | 2018-10-04 11:18:29.000 | 133073     |
+-----------+-------------+-------------------------+-------------------------+------------+
| 3         | 781100-R1-1 | 2018-10-04 11:18:29.000 | 2018-10-04 16:18:29.000 | 133074     |
+-----------+-------------+-------------------------+-------------------------+------------+

更新

将 CTE Splitted 内的行更改为此

    SELECT CAST('<x><y>' + REPLACE(REPLACE(REPLACE(REPLACE(@bbhdn5,CHAR(10),' '),CHAR(13),' '),'|','</y><y>'),';','</y></x><x><y>') + '</y></x>' AS XML) AS Casted

这会将CHAR(13)CHAR(10) 替换为空格。输入中的任何奇怪的换行符都应该消失。好吧,您可能在字符串值中有一些额外的空白。但是你可以再次用单空格替换双空格...

【讨论】:

    【解决方案2】:

    insert 到 WMC_Savexmldata 选择 '496200-01-1|03/31/2018 11:18:29|03/31/2018 16:18:29|133015;245000-01-1|03/31/2018 16:18:29|03/31/2018 21:18:29|133017;262100-13-1|03/31/2018 21:18:29|04/01/2018 02:18:29|133018;'

    请像这样插入数据(附件)。日期在一行中,时间在另一行中,然后运行以下查询。由于日期和时间之间的空间错误,您将收到日期时间转换错误。我只想在日期之间休息一下。由于它来自浏览器,因此日期在 SQL 中带有空格。请帮助解决这个问题。你清楚我的问题吗?

    声明@InputSepTmp 表 ( id int, 输入 nvarchar(max) ) 插入@InputSepTmp 选择 Row_Number() over (Order By (Select null)) , LTrim(RTrim(B.i.value('(./text())1', 'varchar(max)'))) From (Select x = Cast('' + replace((Select replace(XML,';','§§Split§§') as [*] For XML Path('')),'§§Split§§' ,'')+'' as xml).query('.') 来自 WMC_Savexmldata) 作为 A 交叉应用 x.nodes('x') AS B(i)

    -- select * from @InputSepTmp
     --- Cursor   --------------------
            SET NOCOUNT ON
            DECLARE @InputID varchar(200)
             DECLARE cur_InputSeparator CURSOR
            STATIC FOR 
        select id from @InputSepTmp where Inputs <> ''
            OPEN cur_InputSeparator
            IF @@CURSOR_ROWS > 0
             BEGIN 
             FETCH NEXT FROM cur_InputSeparator INTO @InputID
             WHILE @@Fetch_status = 0
              BEGIN
    
              DEclare @FinalInputtmp table
              (
              id int,
              IPValues varchar(100)
              )
    
            insert into @FinalInputtmp
    --        SELECT 
    

    -- Split.a.value('.', 'NVARCHAR(max)') AS 字符串
    --FROM(选择
    -- CAST ('' + REPLACE(LTRIM(RTRIM(Inputs)), ',', '') + '' AS XML) 作为字符串
    -- from @InputSepTmp T1 where id=@InputID) AS A CROSS APPLY String.nodes ('/M') AS Split(a);

    Select Row_Number() over (Order By (Select null)) , LTrim(RTrim(B.i.value('(./text())1', 'varchar(max)'))) From (Select x = Cast('' + replace((Select replace(LTRIM(RTRIM(Inputs)),'|','§§Split§§') as [*] For XML Path('')),' §§拆分§§','')+'' as xml).query('.') 来自@InputSepTmp,其中 id = @InputID) 作为 A 交叉应用 x.nodes('x') AS B(i)

    --select convert(datetime,'04/12/2018 12:50:08')
    
    insert into WMC_CriticalPath_ScheduledDtls (SWOPACKAGENO,TASKNO,SCHEDULEDSTDATE,SCHEDULEDENDDATE,TRACKID,CreatedDate,ModifiedDate)
     SELECT 'adjb', MAX(CASE WHEN D.RN=1 THEN LTRIM(RTRIM(D.IPValues)) END)[task no]
    ,MAX(CASE WHEN D.RN=2 THEN  LTRIM(RTRIM(D.IPValues)) END) [start date]
    ,MAX(CASE WHEN D.RN=3 THEN  LTRIM(RTRIM(D.IPValues)) END) [end date]
    ,MAX(CASE WHEN D.RN=4 THEN LTRIM(RTRIM(D.IPValues)) END) [id], Getdate(),NULL
    

    来自( 选择 * ,ROW_NUMBER() OVER(ORDER BY (SELECT NULL))RN 来自@FinalInputtmp )D

     delete from @FinalInputtmp
    
             FETCH NEXT FROM cur_InputSeparator INTO @InputID
    
             END
            END
            CLOSE cur_InputSeparator
            DEALLOCATE cur_InputSeparator
            SET NOCOUNT OFF
    

    --从 WMC_CriticalPath_ScheduledDtls 中选择 * 从 WMC_CriticalPath_ScheduledDtls 中选择 *

    【讨论】:

    • 这是一个答案吗?这是您问题的附加信息吗?您是否检查了我的答案(这似乎可以实现您想要在这里实现的目标 - 只需几行代码)?
    • 是的,它可以用你的代码来完成。但是当日期和时间出现在两行时。转换失败即将到来。 341300-02-1|04/10/2018 01:18:29|04/10/2018 06:18:29|133072。在 2018 年 4 月 10 日之后按 Enter 并尝试插入并检查分隔符。
    • 只需使用replace 即可摆脱char(10)char(13)。将它们替换为空白或空字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 2020-08-29
    • 2020-03-04
    • 2011-08-05
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    相关资源
    最近更新 更多