我将xml字符串传递给SQL Server中的存储过程,以便将10000条记录插入到我的表中。在这个时我调用这个存储过程。想要检查带有我传递的xml字符串的SQL Server表,如果记录存在我不想插入,如果是单独记录必须插入的新记录。给出一些解决方案。谢谢。
ALTER procedure [dbo].[SP_CMSUSER1]
(@xmlString ntext)
as
begin
DECLARE @idoc INT
DECLARE @data nvarchar(100)
EXEC sp_xml_preparedocument @idoc OUTPUT, @xmlString
INSERT INTO dbo.Seg_RecipientsTemp (ContactID,first_name,last_name,company,email,last_updated)
SELECT ContactID,
first_name,
last_name,
company,
email,
last_updated FROM OPENXML(@idoc,
'/NewDataSet/ContactData', 6)
WITH
(ContactID int ,
first_name nvarchar(50),
last_name nvarchar(50),
company nvarchar(max),
email nvarchar(100),
last_updated datetime
)
end
我的Xml是:
<NewDataSet>
<Table>
<ContactID>2</ContactID>
<last_name>klklk</last_name>
</Table>
<Table>
<ContactID>4</ContactID>
<first_name>k</first_name>
<last_name>kk</last_name>
<company>k</company>
</Table>
<Table>
<ContactID>6</ContactID>
<first_name>naveen</first_name>
<last_name />
<company>inno</company>
</Table>
<Table>
<ContactID>7</ContactID>
<first_name>sridar</first_name>
<last_name />
<company>mahindara</company>
</Table>
<Table>
<ContactID>1</ContactID>
<first_name>terst</first_name>
</Table>
<Table>
<ContactID>2</ContactID>
<first_name />
<last_name>ask</last_name>
<company />
</Table>
</NewDataSet>
答案 0 :(得分:11)
定义存储过程以获取 XML 类型的参数(不再使用ntext
!已弃用)。并且不要为您的存储过程使用sp_
前缀 - 它是Microsoft内部使用的保留前缀,会导致性能下降 - 请使用其他内容! (或者根本不使用任何前缀)
ALTER procedure [dbo].InsertCmsUser
@xmlString XML
AS
......
试试这个(使用SQL Server 2005 和更新的原生 XQuery方法,而不是相当凌乱的OPENXML
界面....):< / p>
;WITH CTE AS
(
SELECT
ContactID = XTbl.value('(ContactID)[1]', 'int'),
FirstName = XTbl.value('(first_name)[1]', 'varchar(50)'),
LastName = XTbl.value('(last_name)[1]', 'varchar(50)'),
Company = XTbl.value('(company)[1]', 'varchar(50)')
FROM
@input.nodes('/NewDataSet/Table') AS XD(XTbl)
)
INSERT INTO
dbo.Seg_RecipientsTemp (ContactID, first_name, last_name, company, last_updated)
SELECT
ContactID,
FirstName,
LastName,
Company,
GETDATE()
FROM
CTE
WHERE
NOT EXISTS (SELECT * FROM dbo.Seg_RecipientsTemp WHERE ContactID = CTE.ContactID)
我在您的XML中找不到任何email
属性 - 不知道您希望从哪里获取该属性....
更新:好的,所以您的真实 XML中似乎也有<last_updated>
个元素....
<last_updated>2012-09-12T22:59:10.813+05:30</last_updated>
这对我来说似乎是DATETIMEOFFSET
- 因为它添加了+05:30
个时区。
在这种情况下,请改用此代码:
;WITH CTE AS
(
SELECT
ContactID = XTbl.value('(ContactID)[1]', 'int'),
FirstName = XTbl.value('(first_name)[1]', 'varchar(50)'),
LastName = XTbl.value('(last_name)[1]', 'varchar(50)'),
Company = XTbl.value('(company)[1]', 'varchar(50)'),
LastUpdated = XTbl.value('(last_updated)[1]', 'datetimeoffset')
FROM
@input.nodes('/NewDataSet/Table') AS XD(XTbl)
)
INSERT INTO
dbo.Seg_RecipientsTemp (ContactID, first_name, last_name, company, last_updated)
SELECT
ContactID,
FirstName,
LastName,
Company,
LastUpdated
FROM
CTE
WHERE
NOT EXISTS (SELECT * FROM dbo.Seg_RecipientsTemp WHERE ContactID = CTE.ContactID)
答案 1 :(得分:0)
还不允许我发表评论,但是即使这不是真正的答案,也希望能提供帮助。 该页面提供了非常详细的说明:
https://www.red-gate.com/simple-talk/sql/learn-sql-server/the-xml-methods-in-sql-server/ (不隶属于)
nodes()方法nodes()方法可能比 比其他XML方法更了解。首先,而不是 返回XML或标量值, nodes()方法返回的是 本质上是一个包含一列的表 。那意味着你应该 仅在可以处理的语句的那些部分中使用该方法 行集视图,例如FROM子句。这也意味着,当您 调用nodes()方法,必须分配表别名和列 方法返回的行集视图的别名,如 以下语法:
DbObject.nodes('XQuery')AS TableAlias(ColumnAlias)