存储过程中的XML节点加密

时间:2018-03-05 06:22:31

标签: sql-server xml stored-procedures sql-server-2012

我需要将一些行插入到使用XML插入值的表中。我面临的问题是该表包含一个字段'password',它在表定义中是varbinary,从前端传递的值应该在插入之前使用数据库中的函数加密

@encryptUsername=dbo.Encrypt(CONVERT(VARCHAR(MAX),@userName))

在使用XML插入值时,我不知道如何执行此操作。

以下是从XML

插入值的示例sp
 INSERT INTO CLIENT(username,password)
   SELECT 
        Col.valueCol.value('(userName/text())[1]','VARCHAR'),
        Col.value('(password/text())[1]','VARCHAR')
 FROM @XmlData.nodes('/usernames/username')   Tab(Col)

这里我需要获取xml节点值'password'并在添加到表之前加密。有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:1)

使用varcharnvarchar没有长度(Bad habits to kick: Varchar without a length (Aaron Bertrand))是危险的。

.value()方法返回一个类型值时,这是varchar(max),您可以直接将其传递给函数。试试这个:

INSERT INTO CLIENT(username,password)
   SELECT 
        dbo.Encrypt(Col.value('(userName/text())[1]','VARCHAR(MAX)')),
        dbo.Encrypt(Col.value('(password/text())[1]','VARCHAR(MAX)'))
 FROM @XmlData.nodes('/usernames/username')   Tab(Col)

注意我从您的代码中获取了上述内容,您使用了Col.valueCol.value()以及Col.value()。我拿了一个我认为正确的那个。

注意2 您应该将INSERT语句更改为SELECT - 语句,以便在更改表格数据之前检查结果...