【问题标题】:Create XML from the input parameter in stored procedure从存储过程中的输入参数创建 XML
【发布时间】:2013-06-19 02:49:01
【问题描述】:

我有一个基于输入参数进行搜索的存储过程。现在出于审计原因,业务需求是将搜索的内容和搜索的对象作为 XML 列保存在 Auditlog 表中。

我在这个例子中简化了我想要做的事情。所有的声明都是我的输入参数。我在我的存储过程中创建 XML 并将其插入到 audit 列中。为了测试这一点,我模拟了行为

DECLARE @LastName varchar(50)
DECLARE @FirstName varchar(50)
DECLARE @RelationShip varchar(50)
DECLARE @CallDate date
DECLARE @CallStartTime time(7)
DECLARE @AdminID int 
DECLARE @HomePhone varchar(15) = null
DECLARE @WorkPhone varchar(15) = null 
DECLARE @MobilePhone varchar(15) = null
DECLARE @SearchXML xml
DECLARE @UserName  varchar(50)

SET @LastName = 'rayan'
SET @FirstName = 'Meg'
SET @RelationShip = 'Friend'
SET @CallDate = (SELECT GETDATE())
SET @CallStartTime = (SELECT CONVERT (time, SYSDATETIME()))
SET @AdminID = 74
SET @HomePhone = null
SET @WorkPhone = null 
SET @MobilePhone = null
SET @UserName = 'nojha'

SET @SearchXML = 
        '<Root>
            <CallerInformation>
                <LastName>' + @LastName + '</LastName>
                <FirstName>' + @FirstName + '</FirstName>
                <Relationship>' + @RelationShip + '</Relationship>
                <CallDate>' + @CallDate + '</CallDate>
                <CallStartTime>' + @CallStartTime + '<CallStartTime/>
                <HomePhone>' + @HomePhone + '</HomePhone>
                <WorkPhone>' + @WorkPhone + '</WorkPhone>
                <WorkPhone>' + @WorkPhone + '<WorkPhone/>
                <UserName>' + @UserName + '</UserName>                  
            </CallerInformation>
        </Root>'

SELECT @SearchXML

执行此操作时出现两个错误

  1. 数据类型varchardate 在add 运算符中不兼容。
  2. 我认为这是由于日期的一些错误。所以我删除了CallDateCallStartTime,看看我是否得到了正确的XML。但是运行上面的查询会返回 null。

有人可以帮我解决这个问题吗?

谢谢 尼哈

【问题讨论】:

  • 如果您将一个字符串与NULL 连接在一起 - 您将总是得到NULL。您需要使用ISNULL(@HomePhone, '')NULL 替换为空字符串(并将其应用于可能是NULL所有 变量)
  • 很好地处理 null 工作。现在你知道如何处理日期

标签: sql sql-server sql-server-2008


【解决方案1】:

您确定您的任何参数都不会包含诸如 & 等保留字符吗?

试试这样的方法:

SET @SearchXML = (SELECT
    @LastName As LastName,
    @FirstName As FirstName,
    @RelationShip As Relationship,
    @CallDate As CallDate,
    @CallStartTime As CallStartTime,
    @HomePhone As HomePhone,
    @WorkPhone As WorkPhone,
    @UserName As UserName
FOR XML RAW ('CallerInformation'), ROOT ('Root'), ELEMENTS);

【讨论】:

  • 不,我的参数中不会有任何保留字符。但据我所知,保留字符会有什么不同
  • @Neha:如果您有任何保留字符,则在尝试将字符串转换为 XML 时会出错:Msg 9421, Level 16, State 1, Line 37 XML parsing: line 4, character 32, illegal name character
  • @Neha:而FOR XML RAW 版本将对保留字符进行编码以生成有效的 XML 节点:&lt;FirstName&gt;Meg&amp;amp;&amp;lt;&amp;gt;&lt;/FirstName&gt;
  • 感谢您的回复。非常感谢您的帮助
【解决方案2】:
  1. 使用“+”时,DATE 和 VARCHAR 不兼容。因此,您必须将 DATE 转换为 VARCHAR 才能连接它们。
  2. 您的某些标签不匹配,例如,结束标签上有 WorkPhone/ 而不是 /WorkPhone。
  3. 您正在连接 NULL 值。这会导致整个字符串变为 NULL。当你没有值时,你需要包装一个 ISNULL(@value,'') 来放置一个空字符串

这是问题部分的一个工作示例:

SET @SearchXML = 
        '<Root>
            <CallerInformation>
                <LastName>' + @LastName + '</LastName>
                <FirstName>' + @FirstName + '</FirstName>
                <Relationship>' + @RelationShip + '</Relationship>
                <CallDate>' + CONVERT(VARCHAR,@CallDate) + '</CallDate>
                <CallStartTime>' + CONVERT(VARCHAR,@CallStartTime) + '</CallStartTime>
                <HomePhone>' + ISNULL(@HomePhone,'') + '</HomePhone>
                <WorkPhone>' + ISNULL(@WorkPhone,'') + '</WorkPhone>
                <WorkPhone>' + ISNULL(@WorkPhone,'') + '</WorkPhone>
                <UserName>' + @UserName + '</UserName>                  
            </CallerInformation>
        </Root>'

【讨论】:

    猜你喜欢
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 2016-07-24
    • 2012-09-18
    相关资源
    最近更新 更多