1

我有一个带有 XML 字符串作为参数的 SQL Server 存储过程。XML 字符串具有dd/MM/yyyy日期格式的日期标签。使用OpenXML时会出现转换错误。即使我有 sql 用户登录,默认语言设置为British English. 它适用于MM-dd-yyyy日期格式。

这是我的代码

Declare    @XML Nvarchar(MAX)                  
Set @XML=   '<root><ContractNo>100213</ContractNo><ContractDate>25/6/2012</ContractDate></root>'

Declare @idoc int

-- Create an internal representaion of XML                          
EXEC sp_xml_preparedocument @idoc OUTPUT, @XML                          

-- Get the data from XML into respective variables                          
SELECT   ContractNo                          
,ContractDate                             
FROM OPENXML(@idoc,'root',2)                          
WITH ( ContractNo nvarchar(30)                          
,ContractDate Datetime                         
) 

错误:

消息 241,级别 16,状态 1,第 10 行
从字符串转换日期和/或时间时转换失败。

4

3 回答 3

2

作为参考,由于您使用的是 SQL Server 2005+,因此您应该开始使用 XML 数据类型和 XQuery。

Declare @XML nvarchar(max);
Set @XML = '<root><ContractNo>100213</ContractNo>
            <ContractDate>25/6/2012</ContractDate></root>';
DECLARE @realXML xml;
set @realXML = @XML;

SELECT @realXML.value('(/root/ContractNo)[1]', 'varchar(max)') ContractNo,
       CONVERT(DATETIME,
               @realXML.value('(/root/ContractDate)[1]', 'varchar(max)'),
               103) ContractDate;

CONVERT()使您可以灵活地处理日期,但如果必须,您可以设置dateformat设置。英式英语有一个“dmy”设置,应该可以处理您的数据。检查其他东西是否没有重置日期格式。否则,在批处理之前显式设置它。例如这有效:

set dateformat dmy;

Declare @XML nvarchar(max);
Set @XML = '<root><ContractNo>100213</ContractNo>
            <ContractDate>25/6/2012</ContractDate></root>';
DECLARE @realXML xml;
set @realXML = @XML;

SELECT @realXML.value('(/root/ContractNo)[1]', 'varchar(max)') ContractNo,
       @realXML.value('(/root/ContractDate)[1]', 'datetime') ContractDate;
于 2012-11-12T10:27:29.480 回答
1

您可以使用样式 103获取日期varchar并在字段列表中使用convertdd/mm/yyyy

SELECT   ContractNo                          
,CONVERT(datetime, ContractDate, 103) as ContractDate
FROM OPENXML(@idoc,'root',2)                          
WITH ( ContractNo nvarchar(30)                          
,ContractDate varchar(10)                         
) 
于 2012-11-12T10:24:36.443 回答
0
        Declare    @XML Nvarchar(MAX)                  
        Set @XML=   '<root><ContractNo>100213</ContractNo><ContractDate>25/6/2012</ContractDate></root>'

        Declare @idoc int

        -- Create an internal representaion of XML                          
        EXEC sp_xml_preparedocument @idoc OUTPUT, @XML                          

        -- Get the data from XML into respective variables                          
        SELECT   ContractNo                          
        ,Convert(Datetime, ContractDate,103)                            
        FROM OPENXML(@idoc,'root',2)                          
        WITH ( ContractNo nvarchar(30)                          
        ,ContractDate nvarchar(10)                        
        ) 
于 2012-11-12T10:28:18.730 回答