Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql IdentityKey=child.personparentsProgregateIdentityKeyfk 如果对象ID('tempdb...\DestinationPersonParentTable')不为空 开始 drop表#DestinationP_Sql_Sql Server - Fatal编程技术网

Sql IdentityKey=child.personparentsProgregateIdentityKeyfk 如果对象ID('tempdb...\DestinationPersonParentTable')不为空 开始 drop表#DestinationP

Sql IdentityKey=child.personparentsProgregateIdentityKeyfk 如果对象ID('tempdb...\DestinationPersonParentTable')不为空 开始 drop表#DestinationP,sql,sql-server,Sql,Sql Server,IdentityKey=child.personparentsProgregateIdentityKeyfk 如果对象ID('tempdb...\DestinationPersonParentTable')不为空 开始 drop表#DestinationPersonParentTable 结束 如果对象_ID('tempdb...#destinationMailAddressPersonChildTable')不为空 开始 drop表#DestinationMailAddressPersonCh

IdentityKey=child.personparentsProgregateIdentityKeyfk 如果对象ID('tempdb...\DestinationPersonParentTable')不为空 开始 drop表#DestinationPersonParentTable 结束 如果对象_ID('tempdb...#destinationMailAddressPersonChildTable')不为空 开始 drop表#DestinationMailAddressPersonChildTable 结束
使用@SCOPE_IDENTITY()返回最后一个标识值,但如何从#测试表中捕获所有标识记录?您需要使用光标一次执行一个操作,这样您就可以插入表a,然后再插入相同ID的表B。不过佳能的方法更好,因为它是一个基于集合的操作,而且效率更高。我已经更新了我的答案来解决您删除的注释中的问题。“我们可以使用while循环和SeopeIO标识吗?”请考虑基于SET的。
create table #test (a int identity(1,1), b varchar(20), c varchar(20))

insert into #test (b,c) values ('bvju','hjab')
insert into #test (b,c) values ('bst','sdfkg')
......
insert into #test (b,c) values ('hdsj','kfsd')
create table #sample (d int identity(1,1), e int, f varchar(20))

insert into #sample(e,f) values (identity value from #test table, 'jkhjk')
insert into #sample(e,f) values (identity value from #test table, 'hfhfd')
......
insert into #sample(e,f) values (identity value from #test table, 'khyy')
insert into #test (b,c) values ('bvju','hjab')
insert into #sample(e,f) values (@SCOPE_IDENTITY(), 'jkhjk')
create table #tempids (a int) -- a temp table for holding our identity values

insert into #test 
(b,c) 
output inserted.a into #tempids -- put the inserted identity value into #tempids
values 
('bvju','hjab')
insert into #test 
(b,c) 
output inserted.a into #tempids -- put the inserted identity value into #tempids
select -- except you use a select here
 Column1
,Column2
from SomeSource
IF OBJECT_ID('tempdb..#DestinationPersonParentTable') IS NOT NULL
begin
        drop table #DestinationPersonParentTable
end



IF OBJECT_ID('tempdb..#DestinationEmailAddressPersonChildTable') IS NOT NULL
begin
        drop table #DestinationEmailAddressPersonChildTable
end



CREATE TABLE #DestinationPersonParentTable
(
PersonParentSurrogateIdentityKey int not null identity (1001, 1), 
SSNNaturalKey int, 
HireDate datetime
)



declare @PersonOutputResultsAuditTable table
(
SSNNaturalKey int, 
PersonParentSurrogateIdentityKeyAudit int
)





CREATE TABLE #DestinationEmailAddressPersonChildTable
(
DestinationChildSurrogateIdentityKey int not null identity (3001, 1), 
PersonParentSurrogateIdentityKeyFK int, 
EmailAddressValueNaturalKey varchar(64),
EmailAddressType int
)





-- Declare XML variable

DECLARE @data XML;

-- Element-centered XML

SET @data = N'
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Person>
        <SSN>222222222</SSN>
        <HireDate>2002-02-02</HireDate>
    </Person>

    <Person>
        <SSN>333333333</SSN>
        <HireDate>2003-03-03</HireDate>
    </Person>

    <EmailAddress>
        <SSNLink>222222222</SSNLink>
        <EmailAddressValue>g@g.com</EmailAddressValue>
        <EmailAddressType>1</EmailAddressType>
    </EmailAddress>

    <EmailAddress>
        <SSNLink>222222222</SSNLink>
        <EmailAddressValue>h@h.com</EmailAddressValue>
        <EmailAddressType>2</EmailAddressType>
    </EmailAddress>

    <EmailAddress>
        <SSNLink>333333333</SSNLink>
        <EmailAddressValue>a@a.com</EmailAddressValue>
        <EmailAddressType>1</EmailAddressType>
    </EmailAddress>

    <EmailAddress>
        <SSNLink>333333333</SSNLink>
        <EmailAddressValue>b@b.com</EmailAddressValue>
        <EmailAddressType>2</EmailAddressType>
    </EmailAddress>

</root>

';




INSERT INTO #DestinationPersonParentTable ( SSNNaturalKey ,  HireDate )

output inserted.SSNNaturalKey , inserted.PersonParentSurrogateIdentityKey  into @PersonOutputResultsAuditTable ( SSNNaturalKey , PersonParentSurrogateIdentityKeyAudit)

SELECT T.parentEntity.value('(SSN)[1]', 'INT') AS SSN,
       T.parentEntity.value('(HireDate)[1]', 'datetime') AS HireDate
FROM @data.nodes('root/Person') AS T(parentEntity)
/* add a where not exists check on the natural key */
where not exists (
    select null from #DestinationPersonParentTable innerRealTable where innerRealTable.SSNNaturalKey = T.parentEntity.value('(SSN)[1]', 'INT') )
;

/* Optional.  You could do a UPDATE here based on matching the #DestinationPersonParentTableSSNNaturalKey = T.parentEntity.value('(SSN)[1]', 'INT')
You could Combine INSERT and UPDATE using the MERGE function on 2008 or later.
 */


select 'PersonOutputResultsAuditTable_Results' as Label, * from @PersonOutputResultsAuditTable


INSERT INTO #DestinationEmailAddressPersonChildTable (  PersonParentSurrogateIdentityKeyFK ,  EmailAddressValueNaturalKey , EmailAddressType )
SELECT  par.PersonParentSurrogateIdentityKeyAudit , 
        T.childEntity.value('(EmailAddressValue)[1]', 'varchar(64)') AS EmailAddressValue,
        T.childEntity.value('(EmailAddressType)[1]', 'INT') AS EmailAddressType
FROM @data.nodes('root/EmailAddress') AS T(childEntity)
/* The next join is the "trick".  Join on the natural key (SSN)....**BUT** insert the PersonParentSurrogateIdentityKey into the table */
join @PersonOutputResultsAuditTable par on par.SSNNaturalKey = T.childEntity.value('(SSNLink)[1]', 'INT')
where not exists (
    select null from #DestinationEmailAddressPersonChildTable innerRealTable where innerRealTable.PersonParentSurrogateIdentityKeyFK = par.PersonParentSurrogateIdentityKeyAudit AND  innerRealTable.EmailAddressValueNaturalKey = T.childEntity.value('(EmailAddressValue)[1]', 'varchar(64)'))
;



print '/#DestinationPersonParentTable/'
select * from #DestinationPersonParentTable


print '/#DestinationEmailAddressPersonChildTable/'
select * from #DestinationEmailAddressPersonChildTable


select SSNNaturalKey , HireDate , '---' as Sep1 , EmailAddressValueNaturalKey , EmailAddressType , '---' as Sep2, par.PersonParentSurrogateIdentityKey as ParentPK , child.PersonParentSurrogateIdentityKeyFK as childFK from #DestinationPersonParentTable par join #DestinationEmailAddressPersonChildTable child
on par.PersonParentSurrogateIdentityKey = child.PersonParentSurrogateIdentityKeyFK



IF OBJECT_ID('tempdb..#DestinationPersonParentTable') IS NOT NULL
begin
        drop table #DestinationPersonParentTable
end


IF OBJECT_ID('tempdb..#DestinationEmailAddressPersonChildTable') IS NOT NULL
begin
        drop table #DestinationEmailAddressPersonChildTable
end